吱吱声和导轨..动态 where 子句



使用Squeel,在rails应用程序中,我有一个条件哈希:

{'trans' => 'manual'}

我最终计划将其移动到一个数组中......所以我也可以有一个操作员分配。

[[field,operator,value][field,operator,value]]

我想使用一个 Model 方法,现在我省略了运算符,我只是在尝试 == 让它工作......但是,我在下面的内容不起作用。

def self.with_conditions(conditions)
    joins{car}.where do
      conditions.map {|key,value| (key==value) }.inject(:&)
    end
end

我也试过这个:

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 在我的任何条件下都没有读取......例如:

在控制台中:

> Timeslip.with_conditions({'car.year'=>'1991'})
SELECT "timeslips".* FROM "timeslips" INNER JOIN "cars" ON "cars"."id" = "timeslips"."car_id"

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

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模型上,我可以运行

User::User.with_conditions({email: "user@example.com", first_name: "Deefour"}).to_sql

我会得到

SELECT "user_users".* FROM "user_users"  WHERE (("user_users"."email" LIKE 'user@example.com' AND "user_users"."first_name" LIKE 'Deefour'))
我不知道

这是否有帮助,但我使用这个帮助程序方法这样做了:

  def query_for_matches(key, value)
    stub = Squeel::Nodes::Stub.new(key)
    Squeel::Nodes::Predicate.new(stub, :matches, "%#{value}%")
  end

您有一个来自某物请求的参数哈希:

  dynamic_params = {'username' => 'some_name', 'email' => 'email@example.com'}

然后我将其与循环中的where链一起使用:

  query = SomeModel #could be User, etc
  dynamic_params.each_pair {|key,value| query = query.where(query_for_matches(key, value)) }

然后,您可以将query传递给您的视图或其他内容。 我只在轨道上呆了几个星期,所以我不确定这是否是最佳实践,但它有效。

相关内容

  • 没有找到相关文章