Как я могу сравнить атрибут экземпляра, который является датой, с текущей датой?

Я пытаюсь написать область или метод, в котором я беру атрибут (last_eaten) экземпляра (line_item) и сравниваю его с текущей датой. Если last_eaten имеет дату от 1 до 7 дней назад, она помещается в массив, который будет называться last_week. Если last_eaten имеет дату 8-14 дней назад, она помещается в массив, который будет называться 2_weeks_ago.

Я пробовал довольно много вещей, как вы можете видеть из закомментированного кода, и несколько вещей, которые я уже стер, но я не могу заставить ничего работать. Я относительно новичок в рельсах, и любая помощь будет принята с благодарностью.

Модель

  class LineItem < ActiveRecord::Base
  belongs_to :recipe
  belongs_to :recipe_collection


  #scope :last_week, lambda {where("line_item.last_eaten >= ?", 7.days.ago)}
  #scope :last_week, lambda { |weeks| where("last_eaten > ?", weeks) }
  #scope :three_weeks, lambda { where( @line_item.last_eaten < 21.days.ago.to_date) }
  #@line_item = LineItem.where(last_eaten: params[:last_eaten]) -- returns nil
  #@line_item = LineItem.where(last_eaten: params[:last_eaten] < 21.days.ago.to_date)

  #def menu
  # list = []
  # if LineItem.last_eaten.day.to_i > 21.days.ago.day.to_i
  #     LineItem.last_eaten.each do |recipe_id|
  #         LineItem.recipe_id  << list
  #     end
  # end
  # list
  #end

end

Схема

ActiveRecord::Schema.define(version: 20151229223926) do

  create_table "directions", force: :cascade do |t|
    t.text     "step"
    t.integer  "recipe_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "directions", ["recipe_id"], name: "index_directions_on_recipe_id"

  create_table "ingredients", force: :cascade do |t|
    t.string   "name"
    t.integer  "recipe_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "ingredients", ["recipe_id"], name: "index_ingredients_on_recipe_id"

  create_table "line_items", force: :cascade do |t|
    t.integer  "recipe_id"
    t.integer  "recipe_collection_id"
    t.datetime "created_at",           null: false
    t.datetime "updated_at",           null: false
    t.date     "last_eaten"
  end

  add_index "line_items", ["recipe_collection_id"], name: "index_line_items_on_recipe_collection_id"
  add_index "line_items", ["recipe_id"], name: "index_line_items_on_recipe_id"

  create_table "recipe_collections", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "recipes", force: :cascade do |t|
    t.string   "title"
    t.text     "description"
    t.integer  "user_id"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
  end

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

person Greg B    schedule 18.02.2016    source источник
comment
scope :last_week, lambda {where("line_item.last_eaten >= ?", 7.days.ago)} это должно сработать... что вы получаете вместо этого? Вы проверили, что >= стоит правильно? О, также: ваша таблица называется line_item или line_items (помните, что при выполнении sql-фрагментов вы имеете в виду имя таблицы, а не имя отдельного объекта rails)   -  person Taryn East    schedule 18.02.2016
comment
...и @TarynEast меня опередили. Я по незнанию в значительной степени продублировал последнюю часть вашего комментария в своем ответе. Если это решит проблему, и если вы хотите создать ответ, я сниму свой - похоже, вы первым разместили комментарий. Дай мне знать.   -  person Michael Cruz    schedule 18.02.2016


Ответы (1)


scope :last_week, lambda {where("line_item.last_eaten >= ?", 7.days.ago)}

должно сработать...

Но дальнейшее чтение заставило меня понять, что ваша таблица называется line_items, а не line_item.

Когда вы делаете sql-фрагменты, вам нужно ссылаться на имя таблицы в SQL, а не рассматривать его как имя отдельного объекта rails. Это означает, что всегда используйте версию во множественном числе :)

person Taryn East    schedule 18.02.2016
comment
Спасибо большое! Это сводило меня с ума. Я должен был сделать небольшое изменение или два. Во-первых, он считает фактический день запуска области, поэтому мне пришлось изменить его на 8.days.ago. Наконец, между datetime и date возник небольшой конфликт, поэтому мне пришлось добавить to_date в конце. Новая область действия: scope :last_week, lambda {where("line_item.last_eaten >= ?", 8.days.ago.to_date)} - person Greg B; 22.02.2016