Ruby on rails 3 如果有两个属于同一模型的关系,Rails ActiveRecord将生成错误的外键

Ruby on rails 3 如果有两个属于同一模型的关系,Rails ActiveRecord将生成错误的外键,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,使用Rails3.2.3,我有用户和消息模型。每条消息都由一个用户拥有,每条消息都有一个可选的from_user字段,该字段还包含一个user.id app/models/user.rb class User < ActiveRecord::Base has_many :messages, :foreign_key => "owner_id", :inverse_of => :owner has_many :messages, :foreign_key =>

使用Rails3.2.3,我有用户和消息模型。每条消息都由一个用户拥有,每条消息都有一个可选的from_user字段,该字段还包含一个user.id

app/models/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
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
填充的外键?还是只需使用
.new
并手动分配所有外键

@message = Message.new(<accessible attributes>)
@message.owner = @user
@message.from_user = @another_user
@message=message.new()
@message.owner=@user
@message.from_user=@另一个_用户

ActiveRecord不喜欢您有两个同名的关联。你必须改变协会的名称。这意味着您还必须提供
class_name
attibute。可能是这样的:

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

谢谢,马上。然后是
@user.owner\u messages.build()
生成。我想知道为什么,如果Rails需要唯一的关联名称,当它们不是唯一的时,它不会抱怨吗?显然,它只是使用了最后一个定义——如果我碰巧定义了
has\u many:messages,:foreign\u key=>“owner\u id”
第二,我永远不会看到这一点。我刚刚意识到
中的
:inverse\u名称必须在
行中更改<代码>属于:所有者,:class\u name=>“User”,:inverse\u of=>:owner\u messages
属于:from\u User,:class\u name=>“User”,:inverse\u of=>:User\u messages
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