Mysql 使用SQL函数更新ActiveRecord属性

Mysql 使用SQL函数更新ActiveRecord属性,mysql,ruby-on-rails,ruby,ruby-on-rails-4,Mysql,Ruby On Rails,Ruby,Ruby On Rails 4,在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)

在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对象之间的差异来实现这一点,但我想知道这是否可以通过模型方法实现。

您可以使用
\update\u all
来实现

c.class.where(id: c.id).update_all("time_to_execute = TIME_TO_SEC(TIMEDIFF(NOW(), time_started))")
请注意,您可以将
c.class
替换为模型的实际类名(答案中当前未显示)

更新以显示原始SQL实现
嘿这看起来很有希望。。但这不会通过模型,而是通过ActiveRecordAssociation。我认为从模型本身来看这可能是“不可能的”?您可以执行原始SQL。我会更新我的答案来证明这一点。不,当然-我理解。是否可以在模型本身上,从模型中执行该操作?我的想法是:
c.update\u attribute\u raw(:time\u start,'time\u TO_SEC(TIMEDIFF(NOW(),time\u start)))
我只是觉得这不可能——但我很想听到一个明确的是或否的回答。你指的是该模型的实例吗?是@user3334690。。对不起,我没有消除歧义:)
c.class.connection.execute "update table set time_to_execute = TIME_TO_SEC(TIMEDIFF(NOW(), time_started)) WHERE id = #{ c.id }"