【问题标题】:Rails update attribute in Model模型中的 Rails 更新属性
【发布时间】:2017-10-24 13:04:38
【问题描述】:

我想更新模型中的:position_status,如果:position_date 等于Date.today,假设我有:position_date,它是Mon, 26 Oct 2017 存储在数据库中,如果Date.today在那个特定日期,然后更新:position_status

我尝试将position_date 更改为今天的日期以查看是否会更新,但:position_date 没有更新。

attr_accessor :update_position_status

def update_position_status
 if Date.today == self.position_date
  self.update_attribute(:position_status => 'Filled')
 end
end

【问题讨论】:

  • 调用这个方法时你应该得到一个错误,因为update_attribute 需要 2 个参数。
  • 你不应该在这里使用attr_accessorattr_accessor 用于为实例属性生成 getter 和 setter 方法 - 不用于方法可访问性。

标签: ruby-on-rails activerecord model update-attributes


【解决方案1】:

update_attribute(名称,值) http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_attribute

update_attribute 更新单个属性并跳过验证。 update_attributes 接受属性哈希并执行验证。

所以更正后的代码是:

def update_position_status!
  update_attribute(:position_status, 'Filled') if self.position_date.today?
end

名称应以! 结尾,因为它会改变(更改)对象。

但是,一条一条地更新记录并不是一个特别可扩展的解决方案。相反,您想按日期选择所有记录并进行大规模更新:

# MySQL    
Thing.where("DATE(position_date)=CURDATE()")
     .update_all(position_status: 'Filled')

# Postgres
Thing.where("date_trunc('day', position_date) = current_date()")
     .update_all(position_status: 'Filled')

【讨论】:

  • 我试图更改代码,但是即使我将日期更改为今天,它也不会自动更新:position_status
  • 自动是什么意思?您需要使用像 cron 选项卡这样的调度程序并每天运行它。
【解决方案2】:

是的update_attribute 需要两个参数。

正确的语法是:

self.update_attribute(:position_status, 'Filled')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多