has_one和has_many等效于ActiveRecord中的has_one和belongs_to_many?

时间:2015-06-01 21:16:20

标签: ruby activerecord associations

在Rails(3.2)中,实现等效于县belongs_to_many Zipcodes和Zipcode has_one县的正确方法是什么,因为没有名为belongs_to_many的关联?

两个模型都有county_code,这在县中是唯一的,而在Zipcode中标识该县的所有邮政编码。 (这个例子假设zipcodes永远不会跨越县)

使用has_one和belongs_to不提供访问县内所有zipcodes的方法:

class Zipcode < ActiveRecord::Base
  has_one :county, foreign_key: "county_code", primary_key: "county_code"
end

class County < ActiveRecord::Base
     # belongs_to_many would be correct, if such a thing existed
  belongs_to :zipcode, foreign_key: "county_code", primary_key: "county_code"
end

# not defined because of the belongs_to
all_zipcodes_in_in_1st_county = County.first.zipcodes

另一方面,使用has_one加上has_many 似乎来做这个伎俩:

class Zipcode < ActiveRecord::Base
  has_one :county, foreign_key: "county_code", primary_key: "county_code"
end

class County < ActiveRecord::Base
  has_many :zipcodes, foreign_key: "county_code", primary_key: "county_code"
end

省略某种形式的belongs_to打破我没有测试的东西?

1 个答案:

答案 0 :(得分:2)

通常情况下,您会使用belongs_to代替has_one进行反向关系(例如Zipcode会使用belongs_to代替has_one)。两者之间的区别在于belongs_to表示基础表具有指向另一个表的外键字段,其中has_one表示它具有指向其后的外键的相关表目前的表格。

由于您在两个表上都有county_code字段(因此必须明确声明哪些字段将用作FK和PK),因此您可以有效地使用has_one或{{1}可交替地,它更多地是在语义上正确的问题。