根据我对 Ruby on Rails 和 ActiveRecord 的理解,当参数查找 ID 时,我可以使用 ActiveRecord 模型本身而不是其 ID。例如,如果我有一个Foo
模型,belongs_to
一个Bar
模型,那么我可以写bar = Bar.new(foo_id: foo)
而不是bar = Bar.new(foo_id: foo.id)
. 但是,在我现在制作的模型中(用于围棋游戏应用程序),情况似乎并非如此。
以下是模型中的相关代码:
class User < ActiveRecord::Base
.
.
.
has_many :participations, dependent: :destroy
has_many :games, through: :participations
end
class Game < ActiveRecord::Base
attr_accessible :height, :width
has_many :participations, dependent: :destroy
has_many :users, through: :participations
def black_player
self.users.joins(:participations).where("participations.color = ?", false).first
end
def white_player
self.users.joins(:participations).where("participations.color = ?", true).first
end
end
class Participation < ActiveRecord::Base
attr_accessible :game_id, :user_id, :color
belongs_to :game
belongs_to :user
validates_uniqueness_of :color, scope: :game_id
validates_uniqueness_of :user_id, scope: :game_id
end
(颜色是一个布尔值,其中 false=black,true=white)
如果我创建了两个Users
( black_player
id=1) 和white_player
(id=2) 和 a Game
game
,我可以这样做:
game.participations.create(user_id: black_player, color: false)
并且game.participations
都black_player.participations
显示了这个新的Participation
:
=> #<Participation id: 1, game_id: 1, user_id: 1, color: false, created_at: "2012-10-10 20:07:23", updated_at: "2012-10-10 20:07:23">
但是,如果我再尝试:
game.participations.create(user_id: white_player, color: true)
那么新的Participation
有一个user_id
1(black_player 的 id)。当我在同一个游戏中针对重复玩家进行验证时,这不是有效的Participation
并且不会添加到数据库中:
=> #<Participation id: nil, game_id: 1, user_id: 1, color: true, created_at: nil, updated_at: nil>
但是,如果我这样做:
game.participations.create(user_id: white_player.id, color: true)
然后它确实有效:
=> #<Participation id: 2, game_id: 1, user_id: 2, color: true, created_at: "2012-10-10 20:34:03", updated_at: "2012-10-10 20:34:03">
这种行为的原因是什么?