我似乎无法弄清楚如何为外键匹配多个字符串列。我有两个型号。商店和社区。两者都有城市和州列。
如何设置多个外键字符串的关联?现在,不列颠哥伦比亚省温哥华的一个社区将为温哥华,不列颠哥伦比亚省和华盛顿州温哥
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
答案 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_key
(unique_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