Rails:我如何在hstore中使用Squeel?

时间:2012-09-05 14:56:46

标签: ruby-on-rails-3 postgresql-9.1 arel sequel hstore

我想在我的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查询?

感谢您的帮助!

3 个答案:

答案 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}'"