我想在我的Rails应用程序(v 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查询?
感谢您的帮助!
答案 0 :(得分:1)
尝试使用sequel hstore gem,这增加了对续集
的hStore支持答案 1 :(得分:1)
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/
答案 2 :(得分:1)
我只是挖了这个。答案似乎在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}'"