未定义的方法"updated_at="用于活动记录



>我正在尝试检查记录是否过时并更新是否过时。这是我的代码:

  @listing = Listing.where(listing_id: listing['listing_id'])
  if @listing.exists?
    if @listing.created_at < 7.days.ago # line where error shows
      @listing.update(state: listing['state'])
    end
  end

我收到以下错误:

undefined method `updated_at' for #<Listing::ActiveRecord_Relation:0x00007fb3ebabbac0> Did you mean? update_all

这是我的数据库记录:

<Listing id: 5, listing_id: 188996174, state: "active", created_at: "2018-03-13 20:43:35", updated_at: "2018-03-13 20:46:48">

而我的迁移:

class CreateListings < ActiveRecord::Migration[5.1]
  def change
    create_table :listings do |t|
      t.integer :listing_id
      t.string :state
      t.timestamps
    end
  end
end

有什么想法吗?提前感谢!

>使用 where ,你会得到一个ActiveRecord_Relation:

@listing = Listing.where(listing_id: listing['listing_id'])

您需要此处的单个对象。

我不确定您是如何设置的,但假设listing_id列是唯一的,以下内容应该可以完成这项工作:

@listing = Listing.find_by(listing_id: listing['listing_id'])

其余代码没问题。因为它只会返回与列表 ID 匹配的第一个对象。因此,您可以尝试在此对象上调用updated_at

如果它们不是唯一的,您可能需要执行以下操作:

@listings = Listing.where(listing_id: params['listing_id'])
@listings.each do |listing|
  listing.update(state: params['state']) if listing.created_at < 7.days.ago
end

或更短:

Listing
  .where(
    'listing_id = ? AND updated_at > ?',
    params['listing_id'],
    Time.zone.now - 7.days
  )
  .update_all(state: params['state'])

最新更新