Rails:除了has_many关联之外,如何使用belongs_to关联进行引用?

时间:2011-07-14 15:30:06

标签: ruby-on-rails ruby-on-rails-3 associations has-many belongs-to

以下设置:用户可以拥有多个地址,但其中至少有一个是主要地址。用户表中的外键应该用作指向主地址记录的指针。

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关联?

2 个答案:

答案 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