Ассоциации активных записей: has_one: through? Или несколько has_one's? - PullRequest
0 голосов
/ 03 мая 2010

Я новичок в Rails, поэтому терпите меня.

У меня есть 3 модели: User, Section и Tick.

Каждый раздел создается пользователем.Мое предположение, связанное с этой ассоциацией:

class Section < ActiveRecord::Base
  has_one :user
end

Далее каждый пользователь может «отметить» раздел - только один раз.Так что для каждого тика у меня есть section_id, user_id и метки времени.Вот где я застрял.Вызывает ли это ассоциацию has_one: through?Если да, то в каком направлении?Если нет, то я далеко.

Какая ассоциация здесь работает?

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 мая 2010
class User < AR::Base
  has_many :ticks
  has_many :sections, :through => :ticks
end

class Section < AR::Base
  has_many :ticks
  has_many :users, :through => :ticks
end

class Tick < AR::Base
  belongs_to :user
  belongs_to :section
  validates_uniqueness_of :user_id, :scope => :section_id
end

Теперь, чтобы найти разделы, отмеченные пользователем, вы делаете user.sections, или чтобы найти всех пользователей, которые отметили определенный раздел, который вы делаете section.users

Здесь у вас есть отношение «многие ко многим» (у пользователя может быть много разделов, а раздел может принадлежать многим пользователям), поэтому для их сопоставления требуется модель соединения. В этом случае модель Тика выступает в качестве модели соединения.

1 голос
/ 03 мая 2010

Это должно быть правильно:

class User < AR::Base
  has_many :sections   #user can have many sections
  has_many :ticks, :through => :sections   #user has many ticks, but the left outer join goes through sections
end

class Section < AR::Base
  belongs_to :user  #each section belongs to 1 user
  has_many :ticks   #each section can have a tick, because of can use has_many
end

class Tick < AR::Base
  belongs_to :section  #a tick belongs to a section
  has_one :user, :through => :sections   #belongs_to :through does not exist, use has_one through
end
0 голосов
/ 03 мая 2010

Попробуйте подписку

class Tick < ActiveRecord::Base
  belongs_to :user
  belongs_to :section
  validates_uniqueness_of :user_id, :scope => :section_id #There is only one user per section
end

Ссылка Это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...