我有一个名为Document
的模型,与has_many
的{{1}}关系。
DocumentProperty
有一个DocumentProperty
,id
,document_id
和key
列。
我试图提出一个查询,让我搜索包含两个或更多键的文档=>值对,例如size = A4 和 pages = 2的文档,但我无法自己编写所有SQL(目前使用ActiveRecord :: Relation) )。
示例表数据:
value
通过我的搜索,应该返回文档1和3。
Rails是否支持此功能?
答案 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 >