首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Squeel和rails...动态where子句

Squeel和rails...动态where子句
EN

Stack Overflow用户
提问于 2013-02-02 03:56:42
回答 2查看 928关注 0票数 3

使用Squeel,在rails应用程序中,我得到了一系列条件:

代码语言:javascript
复制
{'trans' => 'manual'}

我最终计划将其转移到一个数组中。所以我也可以有一个运算符赋值。

代码语言:javascript
复制
[[field,operator,value][field,operator,value]]

我想使用一个模型方法,现在我省略了运算符,我只是尝试==来让它工作……然而,我下面的方法不起作用。

代码语言:javascript
复制
def self.with_conditions(conditions)
    joins{car}.where do
      conditions.map {|key,value| (key==value) }.inject(:&)
    end
end

我还尝试了这个:

代码语言:javascript
复制
def self.with_conditions(conditions)
  joins{car}.where do
    query = nil

    conditions.each do |key, value|
      q = (key == value)

      if query
        query &= q
      else
        query = q
      end
    end

    query     
  end
end

那么,我如何让它与==一起工作,然后我如何最终让它与动态运算符一起工作呢?谢谢

在控制台中,我的SQL无法读取我的任何条件...例如:

在控制台中:

代码语言:javascript
复制
> Timeslip.with_conditions({'car.year'=>'1991'})

SELECT "timeslips".* FROM "timeslips" INNER JOIN "cars" ON "cars"."id" = "timeslips"."car_id"
EN

回答 2

Stack Overflow用户

发布于 2013-02-02 04:21:14

您需要以编程方式构建Squeel查询。例如:

代码语言:javascript
复制
def self.with_conditions(conditions)
  conditions.map do |col, str|
    Squeel::Nodes::Predicate.new(Squeel::Nodes::Stub.new(col), :matches, str) # (email.matches "user@example.com")
  end.inject do |t, expr|
    t & expr # joins each expression from the .map above with & - to be converted to AND in the sql
  end.tap do |block|
    return where{(block)} # pass the constructed expression to Squeel
  end
end

在我的User::User模型上我可以运行

代码语言:javascript
复制
User::User.with_conditions({email: "user@example.com", first_name: "Deefour"}).to_sql

我会得到

代码语言:javascript
复制
SELECT "user_users".* FROM "user_users"  WHERE (("user_users"."email" LIKE 'user@example.com' AND "user_users"."first_name" LIKE 'Deefour'))
票数 3
EN

Stack Overflow用户

发布于 2014-01-03 20:12:33

我不知道这是否有帮助,但我是使用这个helper方法这样做的:

代码语言:javascript
复制
  def query_for_matches(key, value)
    stub = Squeel::Nodes::Stub.new(key)
    Squeel::Nodes::Predicate.new(stub, :matches, "%#{value}%")
  end

你有一个散列的参数,来自某个东西的请求:

代码语言:javascript
复制
  dynamic_params = {'username' => 'some_name', 'email' => 'email@example.com'}

然后,我在一个循环中使用一系列where

代码语言:javascript
复制
  query = SomeModel #could be User, etc
  dynamic_params.each_pair {|key,value| query = query.where(query_for_matches(key, value)) }

然后,您可以将query传递给您的视图或其他任何东西。我在rails上只用了几个星期,所以我不确定这是否是最佳实践,但它是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14654010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档