我有很多关系使用直通模型:
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元素时,我知道它来自特殊用户。我怎样才能做到这一点? 请注意,特殊用户是动态的,因此在其他任何地方都找不到,它只能在游戏和用户之间的关系中找到。
答案 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}