因此,我正在为Ruby on Rails创建一个插件,以便为可以遵循该范例的国家/地区,州,城市和zip_code创建已实现的地址,但这与地址模型的关联方式相悖
首先从我的地址模型开始。
class Address < ActiveRecord::Base
has_one :country
has_one :state
has_one :city
has_one :zip_code
end
说belongs_to
和has_one
似乎是一回事,因为两者只需要一个模型来声明所有权和foreign_key
而且似乎两者都合乎逻辑。
地址属于某个帐户,而帐户有一个地址
这只是语义还是存在真正的差异
答案 0 :(得分:4)
从ActiveRecord关联的角度来看,任何带有belongs_to
声明的模型都有外键,任何带有has_one
声明的模型都有主键。
如果我们查看模型的当前状态,那么您必须确保countries
,sates
,cities
和zip_codes
等表格都有一个名为{的列{1}}。大概这不是你想要的。
因此,您必须更改address_id
模型,如下所示:
Address
这也意味着您必须确保class Address < ActiveRecord::Base
belongs_to :country
belongs_to :state
belongs_to :city
belongs_to :zip_code
end
表格包含以下列:addresses
,country_id
,state_id
和city_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