ActiveRecord Where 子句在 OR 运算符中使用数组项
ActiveRecord Where clause using items of array in OR operator
我有一个这样的数组
arr = %w[android ios]
我想在如下查询的 Where 子句中使用这些值:
SELECT * FROM controls
WHERE company_id = '12345' AND (ios > 13 OR android > 14)
其中 ( ) 中的字段是数组的值.. 所以如果我在数组中只有一个值,它将是
WHERE company_id = '12345' AND (ios > 13)
例如
是否可以在 rails ActiveRecord 上使用 Ruby?
看起来你不需要像这样的数组而是散列
more_than = {
ios: 13,
android: 14
}
您可以使用 sanitize_sql_for_conditions 从带有占位符
的数组构建 SQL 条件字符串
sql_condition_array =
more_than.each_with_object([]) do |(atr, value), sql_array|
if sql_array.empty?
sql_array[0] = "#{atr} > ?"
else
sql_array[0] << " OR #{atr} > ?"
end
sql_array << value
end
# => ["ios > ? OR android > ?", 13, 14]
sql_condition = Control.sanitize_sql_for_conditions(sql_condition_array)
# => "ios > 13 OR android > 14"
或者直接
sql_condition = more_than.map { |atr, value| "#{atr} > #{value}" }.join(" OR ")
# => "ios > 13 OR android > 14"
然后
Control.where(company_id: 12345).where(sql_condition)
查询将是这样的:
SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13 OR android > 14);
如果该散列仅包含一个元素,则不会 OR
像这样使用:
SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13);
定义散列而不是数组,hash = { 'android' => 14, 'ios' => 13}
然后组成一个字符串可以传递给where
完整代码如下所示
hash = { 'android' => 14, 'ios' => 13}
str = ''
hash.each do |k, v|
str += k + ' > ' + v.to_s + ' OR '
end
Control.where(company_id: '12345').where(str[0..-5])
一种更 ActiveRecord 的方法:
Control.where(company_id: 12345).where("ios > ?", 13).or(Control.where(company_id: 12345).where("android > ?", 14))
更好的方法:
controls = Control.where(company_id: 12345)
controls = controls.where("ios > ?", 13).or(controls.where("android > ?", 14))
这会生成下一个 SQL 查询:
SELECT "controls".* FROM "controls" WHERE "controls"."company_id" = 12345 AND (ios > 13 OR android > 14)
我有一个这样的数组
arr = %w[android ios]
我想在如下查询的 Where 子句中使用这些值:
SELECT * FROM controls
WHERE company_id = '12345' AND (ios > 13 OR android > 14)
其中 ( ) 中的字段是数组的值.. 所以如果我在数组中只有一个值,它将是
WHERE company_id = '12345' AND (ios > 13)
例如
是否可以在 rails ActiveRecord 上使用 Ruby?
看起来你不需要像这样的数组而是散列
more_than = {
ios: 13,
android: 14
}
您可以使用 sanitize_sql_for_conditions 从带有占位符
的数组构建 SQL 条件字符串sql_condition_array =
more_than.each_with_object([]) do |(atr, value), sql_array|
if sql_array.empty?
sql_array[0] = "#{atr} > ?"
else
sql_array[0] << " OR #{atr} > ?"
end
sql_array << value
end
# => ["ios > ? OR android > ?", 13, 14]
sql_condition = Control.sanitize_sql_for_conditions(sql_condition_array)
# => "ios > 13 OR android > 14"
或者直接
sql_condition = more_than.map { |atr, value| "#{atr} > #{value}" }.join(" OR ")
# => "ios > 13 OR android > 14"
然后
Control.where(company_id: 12345).where(sql_condition)
查询将是这样的:
SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13 OR android > 14);
如果该散列仅包含一个元素,则不会 OR
像这样使用:
SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13);
定义散列而不是数组,hash = { 'android' => 14, 'ios' => 13}
然后组成一个字符串可以传递给where
完整代码如下所示
hash = { 'android' => 14, 'ios' => 13}
str = ''
hash.each do |k, v|
str += k + ' > ' + v.to_s + ' OR '
end
Control.where(company_id: '12345').where(str[0..-5])
一种更 ActiveRecord 的方法:
Control.where(company_id: 12345).where("ios > ?", 13).or(Control.where(company_id: 12345).where("android > ?", 14))
更好的方法:
controls = Control.where(company_id: 12345)
controls = controls.where("ios > ?", 13).or(controls.where("android > ?", 14))
这会生成下一个 SQL 查询:
SELECT "controls".* FROM "controls" WHERE "controls"."company_id" = 12345 AND (ios > 13 OR android > 14)