与同一模型相关联

时间:2018-03-06 15:14:20

标签: ruby-on-rails activerecord

我有一个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但是没有成功。

1 个答案:

答案 0 :(得分:0)

你真的应该只在你的城市表中添加一个sister_city_id列:

class City
  has_one :sister_city, :class_name => 'City'
end

如果您真的想使用此连接表关联,可以创建如下关系:

City.first.sister_city = City.find(2)