如何在Rails的hstore中使用Squeel

问题描述 投票:2回答:3

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

ruby-on-rails ruby postgresql arel hstore
3个回答
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/


1
投票

尝试使用sequel hstore gem,这将对hStore的支持添加到续集


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}'"
© www.soinside.com 2019 - 2024. All rights reserved.