【问题标题】:Update ActiveRecord attribute with SQL function使用 SQL 函数更新 ActiveRecord 属性
【发布时间】:2015-10-28 14:42:50
【问题描述】:

在 Rails 中,您是否能够通过对 SQL 函数的评估来更新记录的属性?

MySQL 表

| time_started        | time_to_execute |
|---------------------------------------|
| 2015-10-28 14:13:58 |      NULL       |

我想做什么:

update table set time_to_execute = TIME_TO_SEC(TIMEDIFF(NOW(), time_started))

通过模型。


我尝试过使用常见的属性更新方法来做到这一点,但无济于事。

c.update_attribute(:time_to_execute, 'TIME_TO_SEC(TIMEDIFF(NOW(), time_started))')
c.update({:time_to_execute => 'TIME_TO_SEC(TIMEDIFF(NOW(), time_started))'})

是否可以使用 SQL 函数更新 ActiveRecord 模型的属性?

我知道我可以通过执行任意 SQL 或计算两个 DateTime ruby​​ 对象之间的差异来完成此操作,但我想知道这是否可以通过模型方法实现。

【问题讨论】:

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


    【解决方案1】:

    您可以使用#update_all 来执行此操作

    c.class.where(id: c.id).update_all("time_to_execute = TIME_TO_SEC(TIMEDIFF(NOW(), time_started))")
    

    请注意,您可以将 c.class 替换为模型的实际类名(目前未在答案中显示)。

    更新以显示原始 SQL 实现

    c.class.connection.execute "update table set time_to_execute = TIME_TO_SEC(TIMEDIFF(NOW(), time_started)) WHERE id = #{ c.id }"
    

    【讨论】:

    • 嘿..这看起来很有希望..但这不会通过模型,这将通过 ActiveRecordAssociation。我认为模型本身可能“不可能”?
    • 您可以执行原始 SQL。我会更新我的答案以表明这一点。
    • 不,绝对 - 我明白这一点。是否可以在模型本身上从模型中执行该操作?我在想这样的事情:c.update_attribute_raw(:time_started, 'TIME_TO_SEC(TIMEDIFF(NOW(), time_started))') 我只是不认为这是可能的 - 但我很想听到一个明确的是或否
    • sircapsalot 你的意思是模型的实例吗?
    • 是的 @user3334690 .. 抱歉我没有消除歧义:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多