Ruby on Rails と ActiveRecord に関する私の理解から、パラメーターが ID を探しているときに、ID の代わりに ActiveRecord モデル自体を使用できます。たとえば、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 = 黒、true = 白)
(id=1) とUsers
( id=2) の2 つと を作成した場合、次のようにできます。black_player
white_player
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)
次に、newParticipation
の auser_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">
この動作の原因は何ですか?