Путаница новичков в hstore соединяется с рельсами

У меня есть две таблицы на основе 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

Итак, у меня есть два пути:

  • напишите контроллеры rails, ссылающиеся на VIEW в базе данных
  • напишите некоторые рельсы, такие как запросы, используя include, join и т. д.

Я действительно предпочел бы сделать последнее. однако я полностью запутался в том, какой код рельсов использовать.

моя модель (я знаю, что мне не хватает 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  

person yee379    schedule 04.03.2013    source источник


Ответы (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")
person rorra    schedule 04.03.2013