2010-03-30 6 views
0

Не может обернуть мою голову вокруг этого ...Rails: несколько «has_many through» для двух моделей?

class User < ActiveRecord::Base 
    has_many :fantasies, :through => :fantasizings 
    has_many :fantasizings, :dependent => :destroy 
end 

class Fantasy < ActiveRecord::Base 
    has_many :users, :through => :fantasizings 
    has_many :fantasizings, :dependent => :destroy 
end 

class Fantasizing < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :fantasy 
end 

..., который прекрасно работает для моих первичных отношений, в том, что User может иметь много Fantasies, и что Fantasy может принадлежат для многих Users.

Однако, мне нужно добавить еще одно соотношение для нравится (как, User «любит» а Fantasy, а не «есть» это ... думаю, Facebook и как вы можете «как» стены -post, даже если он не «принадлежит» вам ... на самом деле, пример Facebook - это почти то, к чему я стремлюсь).

Я понял, что должен сделать другую ассоциацию, но я немного смущен тем, как я могу ее использовать, или если это даже правильный подход. Я начал, добавив следующее:

class Fantasy < ActiveRecord::Base 

    ... 

    has_many :users, :through => :approvals 
    has_many :approvals, :dependent => :destroy 
end 

class User < ActiveRecord::Base 

    ... 

    has_many :fantasies, :through => :approvals 
    has_many :approvals, :dependent => :destroy 
end 

class Approval < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :fantasy 
end 

... но как создать ассоциацию через Approval, а не через Fantasizing?

Если бы кто-то мог установить меня прямо на это, я был бы очень обязан!

ответ

2

свой первый набор кода, то в вашей модели пользователя оных:

has_many :approved_fantasies, :through => :fantasizings, :source => :fantasy, :conditions => "fantasizings.is_approved = 1" 

В вашем фантазировать таблице, добавьте is_approved булево поле.

+0

Назовите меня скучным, но я не уверен, что следую тому, что вы здесь делаете. Не могли бы вы объяснить немного больше, чтобы я мог понять это? Благодаря! – neezer

+0

Строка кода, которую я разместил, делает то же самое, что и «has_many: fantasies,: through =>: fantasizings», за исключением того, что он проверяет вашу таблицу фантазий для is_approved boolean. Таким образом, User.fantasies перечисляет все фантазии, User.approved_fantasies перечисляет все одобренные фантазии. –

+0

Играли с этим, и я думаю, что я получил суть этого. Благодарю. – neezer

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