Каков наилучший способ создания таблиц ссылок? - PullRequest
1 голос
/ 21 августа 2009

Еще новичок в Rails.

Я уверен, что есть соглашение об именах для того, что я пытаюсь сделать здесь.

У вас есть сообщения, а затем у вас есть теги (на самом деле я не делаю блог, но этот сценарий нам всем знаком).

Я бы настроил свои теги так:

ruby script/generate scaffold tag name:string

Тогда я бы создал таблицу ссылок следующим образом:

ruby script/generate migration x_tag_post tag_id:integer post_id:integer

Так что тогда в моделях у меня будет xTagAsset

belongs_to :tags
belongs_to :posts

А потом в тегах и сообщений я бы сказал

has_many :x_tag_posts

Это правильный способ сделать это? У меня такое чувство, что что-то лучше.

Ответы [ 3 ]

5 голосов
/ 21 августа 2009

Вам нужно использовать встроенную активную запись has_and_belongs_to_many или has_many: through => options

HABTM предполагает существование таблицы в соответствии с некоторыми основными соглашениями и позволяет использовать:

class Tags < ActiveRecord::Base 
  has_and_belongs_to_many :assets 
end 

class Asserts < ActiveRecord::Base 
  has_and_belongs_to_many :tags 
end 

Has Many through явно объявляет присоединяющуюся таблицу:

class Tags < ActiveRecord::Base 
  has_many :assets, :through => "assets_tags"
end 

class Asserts < ActiveRecord::Base 
  has_many :tags, :through => "assets_tags"
end 

Руководства, на которые я ссылался выше, содержат более подробную информацию о реализации.

1 голос
/ 21 августа 2009

Я предпочитаю , у многих есть ассоциации , как то, что написал Тоби Хеде.

class Post < ActiveRecord::Base 
  has_many :assets  
  has_many :tags, :through => :assets 
end

class Asset < ActiveRecord::Base 
  belongs_to :post  
  belongs_to :tag
end 

class Tag < ActiveRecord::Base 
  has_many :assets
  has_many :posts, :through => :assets
end 

Надеюсь, что это поможет:)

0 голосов
/ 21 августа 2009

С точки зрения чисто базы данных вы создаете таблицу с именем PostTag, которая выглядит примерно так. (Это синтаксис SQL Server, YMMV.)

CREATE TABLE PostTag
(PostId INT,
TagId INT
CONSTRAINT PK_PostTag PRIMARY KEY (PostId, TagId))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...