Rails关联多个字符串外键

时间:2016-01-29 08:33:57

标签: mysql ruby-on-rails activerecord

我似乎无法弄清楚如何为外键匹配多个字符串列。我有两个型号。商店和社区。两者都有城市和州列。

如何设置多个外键字符串的关联?现在,不列颠哥伦比亚省温哥华的一个社区将为温哥华,不列颠哥伦比亚省和华盛顿州温哥

Shop
- ID
- City (String)
- State (string)
- Country (string)

belongs_to :neighborhood, foreign_key: :city, primary_key: :city

Neighborhood
- ID
- City (String)
- State (String)
- Country (String)

has_many :shops, foreign_key: :city, primary_key: :city

2 个答案:

答案 0 :(得分:1)

您的模式可以改进。

您引用带有字符串的“foreign_key ...它应该是integer。如果你重构你的模式,问题就会完全消失......

#app/models/shop.rb
class Shop < ActiveRecord::Base
   # id | city_id | ...
   belongs_to :city
end

#app/models/city.rb
class City < ActiveRecord::Base
   has_many :shops
   belongs_to :state #-> can be removed
end

#app/models/state.rb
class State < ActiveRecord::Base
   belongs_to :country #-> can be removed
end

就其性质而言,foreign_key必须标识关联表的primary_keyunique_key):

  

在关系数据库的上下文中,外键是一个表中的字段(或字段集合),唯一标识另一个表的行

这意味着如果您引用 city ,那么城市的“名称”是否相同也无关紧要......如果另一个表包含适当的数据(IE a { {1}}位于City之内。

-

我建议您重构模型,以便State。然后,您就可以将每个Shop belongs_to City与相应的City等相关联。

而不是包含states&amp; State模型,您可以使用countries gem,其中包括对世界各国的引用及其状态。

答案 1 :(得分:0)

休息一下,想出一个简单的解决方案。

商店模特:

belongs_to :neighborhood, foreign_key: :city, primary_key: :city

def neighborhood
  Neighborhood.find_by_city_and_state(city, state)
end

邻里模型:

has_many :shops, foreign_key: :city, primary_key: :city 

def shops
  Shop.where(city: city, state: state)
end