Rails更新第1列,其中Value,Update Column 2其中Value在单个查询中

时间:2017-04-24 05:11:27

标签: sql ruby-on-rails ruby

我可以处理以下代码:

Contact.where(tag1: tag_ids).update_all(tag1: nil)
Contact.where(tag2: tag_ids).update_all(tag2: nil)

是否可以在rails中执行某个查询,如果满足其值需要更新特定列,和/或如果还满足其值,则更新另一列。很抱歉有不好的解释,请参阅上面的代码。

上面的代码可以完全按照我的意愿行事,但是如果有更好的方法或单行代码呢?

2 个答案:

答案 0 :(得分:0)

ActiveRecord::Base.connection.execute(<<-EOQ)
UPDATE contacts
SET tag1 = ( CASE 
 WHEN tag1 IN (#{tag_ids.join(',')) THEN NULL
 ELSE -1
 END),
tag2 = ( CASE
 WHEN tag2 IN (#{tag_ids.join(',')) THEN NULL
 ELSE -1
 END)
EOQ

不太漂亮:)。

答案 1 :(得分:0)

这是不可能的。即使你可以,列也将被修复,丑陋的sql,很容易出错。

由于sql查询需要特定的列,如果某些行tag1tag2查询匹配,您也无法区分它们(哪个字段满足),那么您可以&#39; t决定将哪一列设置为nil。

但你可以简化为

['tag1', 'tag2'].map {|column| Contact.where(column.to_sym => tag_ids).update_all(column.to_sym => nil) }

您可以在数组中添加更多列,例如[&#39; tag1&#39;,&#39; tag2&#39;,tag3&#39;]。

有些复杂性是必要的。