以下设置:用户可以拥有多个地址,但其中至少有一个是主要地址。用户表中的外键应该用作指向主地址记录的指针。
class User < ActiveRecord::Base
has_many :addresses
belongs_to :main_address, :class_name => 'Address', :foreign_key => 'main_address_id'
accepts_nested_attributes_for :main_address
end
class Address < ActiveRecord::Base
belongs_to :user # used for has_many
end
此设置仅适用于读取main_address。但是构建是一个问题,例如通过使用具有嵌套属性(地址字段)的复杂形式进行创建。
我收到以下错误:
SQLite3::ConstraintException: addresses.user_id may not be NULL:
问题是,地址是通过main_address.build
构建的,并且地址没有收到外键user_id
,因为它是通过main_address
构建的。
我不知道:( 如何使用belongs_to关联正确引用has_many关联?
答案 0 :(得分:0)
你对'真实'世界的建模似乎有点奇怪,同样,你想要做的关联很复杂。用户似乎不属于MainAddress,只不过用户属于她的PrimaryVehicle。为什么地址模型上没有布尔值,例如Address#primary? ?
答案 1 :(得分:0)
虽然我同意lukewendling,但另一种方法是在Address
(至User
)中建立关联,然后根据需要使用before_save
更新user_id
。像这样:
has_one :main_user, :class_name => 'User', :foreign_key => 'main_address_id'
before_save :update_user_id
def update_user_id
if main_user.present?
self.user_id = main_user.id
end
end