使用Rails 3.2.3,我有用户和消息模型。每条消息都由用户拥有,每条消息都有一个可选的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
应用/模型/ message.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 Guide:“将创建通过其外键的链接。”)但是当我运行时
@message = @user.messages.build(<accessible attributes>)
我发现它填写了可选的from_user
和而不是强制性owner
。
有没有办法控制哪个外键.build
填写?或者我是否只需要使用.new
并手动分配所有外键?
@message = Message.new(<accessible attributes>)
@message.owner = @user
@message.from_user = @another_user
答案 0 :(得分: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