是否可以在关联(belongs_to)中将postgresql 9.3 json类型用作foreign_key

Ale*_*hev 14 postgresql json ruby-on-rails

我在rails 4.0和postgresql 9.3上有ruby.

我有两个型号:

class Person < ActiveRecord::Base
       belongs_to :address_city, :class_name =>'City', :foreign_key => "address['city_id']"
end

class City < ActiveRecord::Base
   has_many: :address_cities, :class => "Person", :foreign_key => "address['city_id']"
end
Run Code Online (Sandbox Code Playgroud)

address表Person中的字段是JSON类型,并且city_id是此JSON字段中可能的键之一.

那么,我可以将两个模型之间的关联使用Person.first.address_city吗?

ask*_*how 5

默认情况下,Rails使用belongs_to端的foreign_key在两个关联表之间进行SQL连接.所以它不会进入你的JSON字段,寻找foreign_key值.

你可以做的是建立一个关联扩展来查看你的json字段.您可以在rails关联指南中查看如何执行此操作:http: //guides.rubyonrails.org/association_basics.html#association-extensions

在我看来,这是针对rails约定的,你不应该这样做.相反,您可以在人员表中创建名为city_id的新列.然后你做一个迭代人员表的工作,从json中提取city_id并更新city_id列.在此之后,您可以在人员和城市表之间进行正常的1对多关联.如果我在哪里,我也会提取我可能需要的其他领域.然后,您可以在数据库中添加索引以提高速度.

更新:

在Rails 4.2和Postgres中,您可以将json内容直接放在一列中,然后您可以使用rails中的Postgres json查询语法轻松查询它.

所以我认为您可以构建可以查看json内容的Association Extension,尽管我不建议这样做因为违反了约定.

参考文献:

使用json查询whith rails模型的示例:http://robertbeene.com/rails-4-2-and-postgresql-9-4/

Active Record json数据类型:http: //edgeguides.rubyonrails.org/active_record_postgresql.html#json

Postgres json查询语法:http: //www.postgresql.org/docs/9.4/static/functions-json.html