我有一个City
模型,我希望与另一个被称为姐妹城市的城市建立可选关系。为了避免向cities
添加另一列,我想创建一个包含关联的连接表。
create_table :sister_city_mappings do |t|
t.integer :city_id
t.integer :sister_city_id
t.timestamps null: false
end
class City
has_one :sister_city_mapping, :class_name => 'SisterCityMapping',
foreign_key: :city_id
has_one :sister_city, :class_name => 'City', through:
:sister_city_mapping, source: :sister_city
end
class SisterCityMapping
belongs_to :city, :class_name => 'City'
belongs_to :sister_city, :class_name => 'City',
foreign_key: :sister_city_id
end
我可以做City.first.sister_city = City.last
这样的作品,但是我不能像我一样干净利落地处理这种关系:
City.first.sister_city_id = 2
NoMethodError: undefined method `sister_city_id=' for #<City:0x007f893be1b178>
并尝试:
City.first.sister_city = 2
ActiveRecord::AssociationTypeMismatch: City(#70113697769780) expected, got Fixnum(#70113638622260)
我认为这种关联很可能是不正确的,我也试过SisterCityMapping has_one :sister_city
但是没有成功。
答案 0 :(得分:0)
你真的应该只在你的城市表中添加一个sister_city_id列:
class City
has_one :sister_city, :class_name => 'City'
end
如果您真的想使用此连接表关联,可以创建如下关系:
City.first.sister_city = City.find(2)