代码之家  ›  专栏  ›  技术社区  ›  Maayan Naveh

ActiveRecord的未定义方法“updated\u at=”

  •  0
  • Maayan Naveh  · 技术社区  · 6 年前

    我试图检查一条记录是否过时,如果过时,则进行更新。这是我的代码:

      @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
    

    这是我的DB记录:

    <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
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ben    6 年前

    使用 where ,您将获得ActiveRecord\u关系:

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

    这里需要一个对象。

    我不确定您究竟是如何设置的,但假设listing\u id列是唯一的,那么应该执行以下操作:

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

    剩下的代码都没问题。因为它只会返回与listing-id匹配的第一个对象。因此,您可以尝试在此对象上调用updated\u 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'])