我想在我的Rails应用程序(3.2.6版)中使用Squeel gem(基于Arel)。我的hstore列称为属性。
这些工作正常:
User.where{(firstname == 'Ryan') & (lastname == 'Bates')}
User.where{"properties @> ('male' => '1')"}
第二个示例是普通的Postgres查询,因为Squeel似乎不支持hstore函数。
这些不起作用:
User.where{"properties @> ('male' => '1')" & firstname == 'Ryan'}
User.where{("properties @> ('male' => '1')") & (firstname == 'Ryan')}
错误:
NoMethodError: undefined method `&' for "properties @> ('male' => '1')":String
我确实理解该错误,但是我不知道如何封装我的hstore查询。有没有更好的方法来使用Squeel或Arel构建hstore查询?
Squeel通过使用反引号(`)支持SQL文字。
类似以下内容可能会起作用:
Person.where{(id == my{@person.id}) & (`preferences @> send_me_junk_email=>yes`)}
使用反引号时,Squeel将下拉抽象层并直接执行SQL。
http://erniemiller.org/2012/05/30/sql-literals-in-squeel-or-overriding-backticks-in-ruby/
尝试使用sequel hstore gem,这将对hStore的支持添加到续集
我只是研究这个。答案似乎在this file中,基本上您可以在此处添加自己的操作。
此示例使用@>
遍历PostgreSQL数组(demonstrated in this presentation)。
module Squeel
module Nodes
module Operators
def within *list
list = "{#{list.map(&:to_s).join(',')}}"
Operation.new self, :'@>', list
end
end
end
end
[放入此猴子补丁之后,假设存在具有Note
数组字段的tags
模型,则以下Squeel语句变为可能。
Note.where { tags.within 'first tag', 'second tag' }
哪个应该生成看起来像这样的SQL:
"SELECT \"notes\".* FROM \"notes\" WHERE \"notes\".\"tags\" @> '{first tag,second tag}'"