我可以处理以下代码:
Contact.where(tag1: tag_ids).update_all(tag1: nil)
Contact.where(tag2: tag_ids).update_all(tag2: nil)
是否可以在rails中执行某个查询,如果满足其值需要更新特定列,和/或如果还满足其值,则更新另一列。很抱歉有不好的解释,请参阅上面的代码。
上面的代码可以完全按照我的意愿行事,但是如果有更好的方法或单行代码呢?
答案 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查询需要特定的列,如果某些行tag1
或tag2
查询匹配,您也无法区分它们(哪个字段满足),那么您可以&#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;]。
有些复杂性是必要的。