Activerecord其中数组小于条件

时间:2015-08-14 20:40:17

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一系列条件我会传递到where(),条件是一次添加一个,例如

conditions[:key] = values[:key]
...
search = ModelName.where(conditions)

适用于所有我想要与之比较的人#39; ='但是我想添加一个'< ='条件到数组而不是' ='比如

conditions[:key <=] = values[:key]

当然不会起作用。有没有办法使这项工作,所以我可以结合&#39; =&#39;条款与&#39;&lt; =&#39;相同条件数组中的子句?

2 个答案:

答案 0 :(得分:1)

一种方法:

您可以在<=子句中使用where,如下所示:

   User.where('`users`.`age` <= ?', 20)

这将生成以下SQL:

SELECT `users`.* FROM `users` WHERE (`users`.`age` <= 20)

Update_1:

对于多种情况,您可以这样做:

User.where('`users`.`age` <= ?', 20).where('`users`.`name` = ?', 'Rakib')

Update_2:

以下是where子句中多个条件的另一种方式:

User.where('(id >= ?) AND (name= ?)', 1, 'Rakib')

您可以在AND OR子句中添加任意数量的ActiveRecord where条件。我只是用2表示保持简单。

有关详情,请参阅Ruby on Rails Official Documentation了解Array Conditions

Update_3:

Array Conditions子句中如何使用where的另一个细微变化:

conditions_array = ["(id >= ?) AND (name = ?)", 1, "Rakib"]
User.where(conditions_array)

我认为,这个符合您的确切要求。

答案 1 :(得分:1)

你可以使用arel。

conditions = {x: [:eq, 1], y: [:gt, 2]}

model_names = ModelName.where(nil)

conditions.each do |field, options|
  condition = ModelName.arel_table[field].send(*options)
  model_names = model_names.where(condition)
end

model_names.to_sql --> 'SELECT * FROM model_names WHERE x = 1 and y > 2'