2010-05-03 2 views
0

Я совершенно новый для Rails, так что несите меня.Ассоциации активных записей: has_one: через? Или несколько has_one?

У меня есть 3 модели: пользователь, раздел и тик.

Каждый раздел создан пользователем. Я думаю с этой ассоциацией:

class Section < ActiveRecord::Base 
    has_one :user 
end 

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

В какое сообщество работает?

Спасибо!

ответ

1

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

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

Как создаются отношения в вашем коде, это отражает отношение между пользователем и тиком, а раздел - это то, что объединяет их. Разве это не значит, что пользователь и раздел связаны друг с другом, а тик - это то, что связывает их вместе? По крайней мере, так я вижу это – Faisal

+0

Я не уверен, что «принадлежит: пользователю» правильно - я бы подумал, что это будет «has_one: user»? ... может быть, мое объяснение плохое. Пожалуйста, исправьте меня, если я ошибаюсь или вам нужно объяснить. Это похоже на другой пример из Фейсала ... попытка выяснить, что правильно. Спасибо за помощь!!! – jmccartie

0

Try После

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 

Ref This

1
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

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

+0

Спасибо. Так как user_id требуется для создания раздела, мне нужно создать там отдельную ассоциацию? Минус: клещи ассоциации? Пользователь has_many: разделы, раздел has_one: пользователи? – jmccartie

+0

hmm, если вы хотите отношение «один ко многим» (у пользователя есть раздел, раздел принадлежит одному пользователю), тогда вы должны сделать это как пользователь has_many: разделы, раздел принадлежит_у: пользователю. Сначала я понял, что пользователи и разделы связаны друг с другом многими. Но если вы хотите, чтобы они были «один ко многим», проверьте ответ PlanetMasters. – Faisal

Смежные вопросы