Rails: Несколько «Has_many через» для двух тех же моделей?

StackOverflow https://stackoverflow.com/questions/2542526

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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 и о том, как вы можете «понравиться« настенный пост, хотя это не "принадлежит вам ... На самом деле, пример Facebook-это почти именно то, что я" M стремится).

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

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?

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

Это было полезно?

Решение

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

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

В своей фантазийной таблице добавьте логическое поле IS_PRED.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top