Rails: Несколько "has_many through" для двух одинаковых моделей? - PullRequest
0 голосов
/ 30 марта 2010

Не могу обернуть голову вокруг этого ...

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.

Однако мне нужно добавить еще одно отношение для liking (например, User "любит" a Fantasy, а не "имеет" это ... думаю о Facebook и о том, как вы можете «любить» пост на стене, даже если он не «принадлежит» вам ... на самом деле, пример 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?

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

1 Ответ

2 голосов
/ 30 марта 2010

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

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

В таблицу Fantasizing добавьте логическое поле is_approved.

...