【问题标题】:Rails 3 update_all with condition in consoleRails 3 update_all 在控制台中有条件
【发布时间】:2014-11-22 06:38:41
【问题描述】:

我有一个带有 Facility 模型的 Rails 3.2.14 应用程序,我需要根据名为 facility_name 的字段更新 Facility 模型中的 region_id。

所以我正在尝试更新设施名称以 DFW 开头的所有设施。

在控制台中我尝试了这个:

Facility.where("facility_name: ilike 'DFW'")

这给了我 nil 或 0 记录返回。

我希望能够做这样的事情来更新 Facility 模型中的 region_id:

Facility.where("facility_name: ilike 'DFW'").update_all(region_id: '1')

但这不起作用,因为我的 where 方法报告计数为 0,即使有大量的 facility_name 以 DFW 开头的记录。

是我的语法错误还是在 Rails 3 中不可能做到这一点?如果没有,我将如何在不使用 crud/rails_admin 的情况下使用此区域 id 更新 100 多条记录?

我问了一个关于如何使用 update_all 的类似问题,但它没有涵盖条件部分。希望这不会被视为重复。

【问题讨论】:

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


    【解决方案1】:

    看起来你有点混淆了语法。

    当您在字符串中放置 where 条件时,您需要符合数据库适配器的语法。所以对于有 ilike 的 postgres,你需要这样做:

    Facility.where("facility_name ilike 'DFW'")
    

    当你传递一个哈希值时使用冒号,但不能做类似的声明:

    Facility.where(facility_name: 'DFW')
    

    请注意,如果您希望 ilike 检查列中包含该值的任何行,则需要尾随和前导百分号。

    Facility.where("facility_name ilike '%DFW%'")
    

    您可以从那里执行 update_all

    【讨论】:

    • 感谢您的快速回复。 `Facility.where("facility_name ilike '%DFW%'")' 成功了。我应该在我的模型中查看我的搜索方法以了解 ilike 语法。这有点早,我的大脑没有连接,我应该知道这一点。感谢您向我指出。 :)
    • 不用担心。当您查看日志文件或使用 rails 控制台时,通常可以看到创建的 SQL 查询。了解您的活动记录代码是否正确的好方法:)
    • 好点,我也应该提醒自己在第二杯咖啡之前不要进行任何开发。 :)
    • 现在如果你能帮我解决这个问题,我会给你买杯咖啡/啤酒 :) Rails Dynamically Changing Collection Select in form based on form field
    猜你喜欢
    • 2019-10-20
    • 2011-06-20
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多