Rails Many To Many,添加包含额外信息的记录

时间:2013-06-30 02:55:30

标签: ruby-on-rails many-to-many has-many-through

我有很多关系使用直通模型:

game.rb:

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

user.rb

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

show.rb

belongs_to :game
belongs_to :user

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

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

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

1 个答案:

答案 0 :(得分: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

如果您不想为特殊和非特殊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}