6
使用Rails的3.2.3,我有用户和消息模型。每条消息都由用户拥有,并且每条消息都有一个可选的from_user字段,该字段也采用user.id.Rails的ActiveRecord建立错误的外键,如果有两个belongs_to关系到相同的模型
应用程序/模型/ 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
的主要原因是实例化一个(可能受保护的)外键,对吧? (见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
谢谢,现货。然后它是'@ user.owner_messages.build()'来构建。我想知道为什么,如果Rails需要唯一的关联名称,那么当它们不是唯一的时候它不会抱怨?显然它只是使用最后一个定义 - 如果我碰巧定义了'has_many:messages,:foreign_key =>“owner_id”'second,我永远不会看到这个。 –
刚刚意识到':inverse_of'名称必须在'belongs_to'行中改变。 'belongs_to:owner,:class_name =>“User”,:inverse_of =>:owner_messages'和'belongs_to:from_user,:class_name =>“User”,:inverse_of =>:user_messages'。 –