0

2 つの postgres hstore ベースのテーブルと がentityありinfo、どちらも次のようになります。

   Column   |           Type           |                           Modifiers
------------+--------------------------+---------------------------------------------------------------
 id         | integer                  | not null default nextval('entity__entities_id_seq'::regclass)
 created_at | timestamp with time zone | not null
 updated_at | timestamp with time zone | not null
 context    | hstore                   | default hstore((ARRAY[]::character varying[])::text[])
 data       | hstore                   | default hstore((ARRAY[]::character varying[])::text[])

だから私が実行したいSQLのクエリは次のようなものです:

SELECT e.context->'device' AS device, i.data->'location' AS location from entity AS e 
  LEFT JOIN info AS i ON e.context->'device' = i.context->'device'  
  WHERE e.data->'type'='chassis

だから私は2つのパスがあります:

  • データベースの VIEW を参照する Rails コントローラを記述します
  • インクルード、ジョインなどを使用してクエリのようないくつかのレールを作成します。

私は本当に後者をしたいと思います。ただし、使用するレールコードについては完全に混乱しています。

私のモデルは次のとおりです(行方不明belongs_toなどは知っていますが、hstoreフィールドとの関係を作成する方法がわかりません):

class Device < ActiveRecord::Base
  self.table_name = 'entity'
  self.primary_key = 'id'
  attr_accessible :id, :created_at, :updated_at, :context, :data
  serialize :context, ActiveRecord::Coders::Hstore
  serialize :data, ActiveRecord::Coders::Hstore
end

class DeviceInfo < ActiveRecord::Base
  self.table_name = 'info'
  self.primary_key = 'id'
  attr_accessible :id, :created_at, :updated_at, :context, :data
  serialize :context, ActiveRecord::Coders::Hstore
  serialize :data, ActiveRecord::Coders::Hstore
end  
4

1 に答える 1

1

私が間違っているかもしれませんが、ActiveRecord の哲学は、データベースに共通のレイヤーを作成することでした。そのクエリは、シリアル化された内部結合を使用して postgres に非常に関連しています。

それを行う生のクエリを書くことができます:

Device.find_by_sql("SELECT e.context->'device' AS device, i.data->'location' AS location from entity AS e LEFT JOIN info AS i ON e.context->'device' = i.context->'device' WHERE e.data->'type'='chassis")
于 2013-03-04T22:43:52.513 に答える