2013-11-25 8 views
0

В списке есть один владелец (пользователь). В списке также есть несколько участников (также пользователей). Я попытался определить отношения между тремя моделями: User, List и Panelist. Но я никуда не уйду.has_many: через и has_many отношения между этими двумя моделями

user.rb

class User < ActiveRecord::Base 
    has_many :lists 
    has_many :panelMemberships, :through => :panelists, :source => :lists 
end 

list.rb

class List < ActiveRecord::Base 
    belongs_to :user 
    has_many :panelMembers, :through => :panelists, :source => :user 
end 

panelist.rb

class Panelist < ActiveRecord::Base 
    belongs_to :list 
    belongs_to :user 
end 

Я пробовал все разные Комбен но ничего не работает. Заранее благодарим за любую помощь, которую вы можете предоставить.

ответ

1

Модель также должна иметь отношение has_many для любой сквозной модели, поэтому везде, где у вас есть has_many: x, через:: y, вам также нужно сказать has_many: y. Вы также не должны иметь модель участника, отдельную от вашей модели пользователя, если участники опроса являются пользователями (если вы не делаете STI, а это не так). Из того, что я понимаю, что вы пытаетесь сделать что-то вроде этого:

class User < ActiveRecord::Base 
    has_many :owned_lists, class_name: "List", foreign_key: :owner_id # this is for the owner/list relationship 
    has_and_belongs_to_many :lists # for the normal panelist/list relationship 
end 

class List < ActiveRecord::Base 
    belongs_to :owner, class_name: "User" 
    has_and_belongs_to_many :users 
end 

Тогда вам нужно сделать миграцию за users_lists (с идентификатором пользователя и список идентификаторов) таблица, которая будет ваш присоединиться к таблице, но не будет нуждаться в собственной модели. Но если вы действительно хотите сохранить сквозные отношения (хорошо, если вы делаете другие вещи с помощью модели объединения), то вы бы сделали:

class User < ActiveRecord::Base 
    has_many :owned_lists, class_name: "List", foreign_key: :owner_id # this is for the owner/list relationship 
    has_many :panel_memberships 
    has_many :lists, through: :panel_memberships 
end 

class List < ActiveRecord::Base 
    belongs_to :owner, class_name: "User" 
    has_many :panel_memberships 
    has_many :users, through: :panel_memberships 
end 

class PanelMembership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :list 
+0

Большое вам спасибо. Ваше решение было почти идеальным, за исключением того, что мне пришлось сменить owner_to: owner, class_name: «Пользователь», принадлежащий_to: owner,: class_name => «Пользователь»,: foreign_key =>: owner. Теперь все отлично работает! – MikeC

+0

потрясающий! о, да, я думаю, в рельсах 3 вы должны это сделать; В основном я использую рельсы 4, где вам не нужны хэш-ракеты. – ussferox

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