Rails在Model中更新属性

时间:2017-10-24 13:04:39

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

我想根据: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

2 个答案:

答案 0 :(得分:1)

update_attribute需要两个参数。

正确的语法是:

self.update_attribute(:position_status, 'Filled')

答案 1 :(得分:1)

  

update_attribute(name,value)   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')