Ruby on Rails:一对一映射。只是语义或真正的不同结构

时间:2010-03-14 05:53:05

标签: ruby-on-rails ruby

因此,我正在为Ruby on Rails创建一个插件,以便为可以遵循该范例的国家/地区,州,城市和zip_code创建已实现的地址,但这与地址模型的关联方式相悖

首先从我的地址模型开始。

class Address < ActiveRecord::Base
    has_one :country
    has_one :state
    has_one :city
    has_one :zip_code
end

belongs_tohas_one

之间有什么区别

似乎是一回事,因为两者只需要一个模型来声明所有权和foreign_key

而且似乎两者都合乎逻辑。

  

地址属于某个帐户,而帐户有一个地址

这只是语义还是存在真正的差异

1 个答案:

答案 0 :(得分:4)

从ActiveRecord关联的角度来看,任何带有belongs_to声明的模型都有外键,任何带有has_one声明的模型都有主键。

如果我们查看模型的当前状态,那么您必须确保countriessatescitieszip_codes等表格都有一个名为{的列{1}}。大概这不是你想要的。

因此,您必须更改address_id模型,如下所示:

Address

这也意味着您必须确保class Address < ActiveRecord::Base belongs_to :country belongs_to :state belongs_to :city belongs_to :zip_code end 表格包含以下列:addressescountry_idstate_idcity_id(我假设这是你当前的表结构。)

修改 [我扩展了我的答案,以解决评论部分提出的问题。] 在您的示例中,您应该使用zip_code_id关联而不是has_many关联。

has_one

您可以拨打电话,如:

class Country
  has_many   :addresses
end

class State
  has_many   :addresses
end

class City
  has_many   :addresses
end

class ZipCode
  has_many   :addresses
end

我在以下场景中使用了has_one关联。

1)具有个人资料的用户

country.addresses
state.addresses
city.addresses
zip_code.addresses

2)商店的商家帐户

 User has one Profile
 Profile belongs to User