我有一个清单模型和一个国家模型。每个清单都有一个国家(作为其地址详细信息的一部分),但每个清单也可以有几个ExportCountries(即清单所有者出口到的国家)。
A listing has_one country
A Country has_many listings
A listing has_and_belongs_to_many ExportCountries
An ExportCountry has_and_belongs_to_many Listings
如果我有两个独立的模型,我可能会这样做:
class Listing < ActiveRecord::Base
belongs_to :country
has_and_belongs_to_many :export_countries
end
class Country < ActiveRecord::Base
has_many: listings
end
class ExportCountry < ActiveRecord::Base
has_and_belongs_to_many :listings
end
但是我怎么能做到只有一个国家模型-因为否则ExportCountry将有完全相同的记录,这不是很DRY,只是不像rails。
您需要的是具有相同类的两个独立关联作为最终结果。您只需要在关联中指定这些,以便它可以正确地解释它们,如下所示:
class Country < ActiveRecord::Base
has_many :address_listings, class_name: "Listing", :foreign_key => "address_country_id"
has_and_belongs_to_many :export_listings, class_name: "Listing", :join_table => :export_countries_listings
end
class Listing < ActiveRecord::Base
belongs_to :address_country, class_name: "Country"
has_and_belongs_to_many :export_countries, class_name: "Country", :join_table => :export_countries_listings
end
address_country_id应该是listing表中的一列。
和出口国家的联接表
create_table :export_countries_listings, :id => false do |t|
t.integer :country_id
t.integer :listing_id
end
为地址Country设置一个引用,为export_countries设置多个引用。