0

我有一个使用直通模型的多对多关系:

游戏.rb:

has_many :shows, dependent: :destroy
has_many :users, :through => :shows

用户.rb

has_many :shows
has_many :games, :through => :shows

显示.rb

belongs_to :game
belongs_to :user

现在我以这种方式向用户添加游戏:

game.users << special_users
game.users << non_special_users

在将用户添加到游戏时,我想指定用户的类型,以便在查看显示元素时,我知道它来自特殊用户。我怎样才能做到这一点?请注意,特殊用户是动态的,因此在其他任何地方都找不到,只能在游戏和用户之间的关系中找到。

4

1 回答 1

2

有几种方法可以做到这一点。最简单的方法是直接添加节目:

game.shows << special_users.map{|u| Show.new(user: u, special: true) }
game.shows << non_special_users.map{|u| Show.new(user: u, special: false) }

或者,您可以创建具有“特殊”条件的关联:

#game.rb
has_many :special_shows, lambda{ where(special: true) }, class_name: 'Show'
has_many :non_special_shows, lambda{ where(special: false) }, class_name: 'Show'
has_many :special_users, through: :special_shows, source: user
has_many :non_special_users, through: :non_special_shows, source: user

game.special_users << special_users
game.non_special_users << non_special_users

如果您不想为 special 和 non-special 设置新范围shows,可以在users关联上进行区分:

has_many :shows
has_many :special_users, lambda{ where(shows: {special: true}) }, through: :shows, source: :user
has_many :non_special_users, lambda{ where(shows: {special: false}) }, through: :shows, source: :user

请注意,在早期版本的 Rails 中,lambda不支持范围条件。在这种情况下,conditions:向选项哈希添加一个值:

has_many :special_shows, class_name: 'Show', conditions: {special: true}
has_many :non_special_shows, class_name: 'Show', conditions: {special: false}
于 2013-06-30T03:20:48.657 回答