2014-02-11 45 views
12

我在rails 4.0和postgresql 9.3上有ruby。是否有可能在關聯(belongs_to)中使用postgresql 9.3 json類型作爲foreign_key

我有兩個型號:

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 

addressPerson是JSON類型,city_id是這個領域的JSON可能的關鍵之一。

那麼,我可以使兩個模型之間的關聯使用像Person.first.address_city

+0

您不能在JSON字段中創建外鍵,但這並不意味着Rails可能不支持在應用程序級建模關聯;我會留給Rails的人來回答。 –

回答

5

默認情況下,Rails使用belongs_to端的foreign_key在兩個關聯的表之間執行SQL連接。所以它不會進入你的JSON字段尋找foreign_key值。

你可以做的是建立一個關聯擴展來查看你的json字段。你可以看看這裏的軌道協會指南如何做到這一點: http://guides.rubyonrails.org/association_basics.html#association-extensions

在我看來這是違反鐵軌公約,你不應該這樣做。相反,您可以在persons表中創建一個名爲city_id的新列。然後,您執行迭代persons表的工作,從json中提取city_id並更新city_id列。在此之後,你可以做一個正常的人與城市之間的很多關聯表。如果我在哪裏,我也會提取其他我可能需要的領域。然後,您可以在數據庫中添加索引以獲得速度。

更新:

在Rails 4.2和Postgres,你可以直接把JSON內容在一列,然後你可以使用JSON Postgres的查詢語法在導軌方便地查詢它。

所以我認爲你可以構建可以查看JSON內容的關聯擴展,儘管我不會建議這是因爲違反了約定。

參考文獻:

使用JSON查詢蒙山軌道模型實例:http://robertbeene.com/rails-4-2-and-postgresql-9-4/

活動記錄JSON數據類型: http://edgeguides.rubyonrails.org/active_record_postgresql.html#json

Postgres的JSON查詢語法: http://www.postgresql.org/docs/9.4/static/functions-json.html

+0

如何使用關聯擴展來使AR使用JSON字段作爲外鍵? –

0

我已經有同樣的問題。

目前有方法進行查詢,它適用於我。

With Rails 4.2.6 and Postgres 9。5它應該像這樣工作:

class Person < ActiveRecord::Base 

    def address_city 
    City.find_by(id: address['city_id']) 
    end 

end 

class City < ActiveRecord::Base 

    def address_cities 
    Person.where(["(address->>'city_id')::int = ?", id]) 
    end 

end 

我進一步研究解決我的問題和Sequel ORM似乎支持這一點:

https://github.com/jeremyevans/sequel/blob/master/doc/association_basics.rdoc#associations-based-on-sql-expressions-options

考慮用它代替活動記錄,我考慮在不久的將來這樣做

相關問題