6

Rails 3.2.3 を使用して、User モデルと Message モデルを使用しています。各メッセージはユーザーが所有し、各メッセージにはオプションの from_user フィールドがあり、user.id も受け取ります。

アプリ/モデル/user.rb

class User < ActiveRecord::Base
  has_many :messages, :foreign_key => "owner_id",     :inverse_of => :owner
  has_many :messages, :foreign_key => "from_user_id", :inverse_of => :from_user
end

アプリ/モデル/メッセージ.rb

class Message < ActiveRecord::Base
  belongs_to :owner, :class_name => "User", :inverse_of => :messages
  validates  :owner, :presence => true   # Every message must have an owner_id

  belongs_to :from_user, :class_name => "User", :inverse_of => :messages
end

私が見ている問題は、.build方法にあります。使用する主な理由.buildは、(おそらく保護されている) 外部キーをインスタンス化することですよね? ( Active Record 関連付けに関するRails ガイドを参照してください:「外部キーを介したリンクが作成されます。」)ただし、実行すると

@message = @user.messages.build(<accessible attributes>)

必須ではなくfrom_user、オプションを埋めていることがわかりました。owner

どの外部キー.buildが入力されるかを制御する方法はありますか? それとも.new、すべての外部キーを手動で使用して割り当てる必要がありますか?

@message = Message.new(<accessible attributes>)
@message.owner = @user
@message.from_user = @another_user
4

1 に答える 1

5

ActiveRecord は、同じ名前の関連付けが 2 つあることを好みません。関連付け名を変更する必要があります。これは、属性も指定する必要があることを意味しますclass_name。たぶん次のようなもの:

has_many :owner_messages, :class_name => 'Message', :foreign_key => "owner_id",     :inverse_of => :owner
has_many :user_messages, :class_name => 'Message', :foreign_key => "from_user_id", :inverse_of => :from_user
于 2012-05-29T19:45:25.180 に答える