搜索具有多个属性的模型(其中属性位于键=>值表中)

时间:2016-11-02 13:09:38

标签: ruby-on-rails ruby-on-rails-4

我有一个名为Document的模型,与has_many的{​​{1}}关系。

DocumentProperty有一个DocumentPropertyiddocument_idkey列。

我试图提出一个查询,让我搜索包含两个或更多键的文档=>值对,例如size = A4 pages = 2的文档,但我无法自己编写所有SQL(目前使用ActiveRecord :: Relation) )。

示例表数据:

value

通过我的搜索,应该返回文档1和3。

Rails是否支持此功能?

2 个答案:

答案 0 :(得分:0)

是的,ActiveRecord支持这样的查询:

Document.joins(:document_properties)
        .where("document_properties.key = 'size' AND document_properties.value = 'A4' OR document_properties.key = 'pages' AND document_properties.value = 2")
        .group('documents.id')

答案 1 :(得分:0)

我在rails中构建模型。试试这个,首先计算document_ids,

2.2.3 :002 > document_ids = DocumentProperty.where(key: 'size', value: 'A4').pluck('document_id') & DocumentProperty.where(key: 'pages', value: '2').pluck('document_id')
   (0.3ms)  SELECT `document_properties`.`document_id` FROM `document_properties` WHERE `document_properties`.`key` = 'size' AND `document_properties`.`value` = 'A4'
   (0.3ms)  SELECT `document_properties`.`document_id` FROM `document_properties` WHERE `document_properties`.`key` = 'pages' AND `document_properties`.`value` = '2'
 => [1, 3]
2.2.3 :003 > Document.where(id: document_ids)
  Document Load (1.1ms)  SELECT `documents`.* FROM `documents` WHERE `documents`.`id` IN (1, 3)
 => #<ActiveRecord::Relation [#<Document id: 1, name: "first", created_at: "2016-11-02 14:07:38", updated_at: "2016-11-02 14:07:38">, #<Document id: 3, name: "three", created_at: "2016-11-02 14:07:38", updated_at: "2016-11-02 14:07:38">]>
2.2.3 :004 >