将Rails方法转换为可链接范围

时间:2017-09-09 09:32:44

标签: ruby-on-rails activerecord named-scope

我的网站上有一个页面,允许人们根据一系列标准过滤汽车。这些标准通过参数传递。

我想添加一个新标准,但模型中执行此操作的逻辑是一种方法。我无法将其添加到我的控制器过滤逻辑中,因为这完全基于Active Record查询和可链接部分。

如何将以下方法转换为与我的过滤器逻辑中的查询和链兼容的内容?

方法:

  def self.new_cars_in_year(year)
    new_cars = []

    Car.all.includes(:drives).each do |car|
      years_driven_car = []
      c = car.drives.where("date IS NOT ?", nil)

      c.each do |drive|
        years_driven_car << (Date.parse drive.date).year
      end

      years_driven_car = years_driven_car.uniq

      if car.unknown_drives
        years_driven_car.shift
      end

      if years_driven_car.min == year
        new_cars << car
      end
    end

    new_cars
  end

架构:

ActiveRecord::Schema.define(version: 20170816154910) do
  create_table "cars", force: :cascade do |t|
    t.text     "notes",                     limit: 65535
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "slug",                      limit: 255
    t.string   "covering",                  limit: 255
    t.text     "style",                     limit: 65535
    t.text     "model",                     limit: 65535
    t.float    "speed",                     limit: 24
    t.boolean  "unknown_drives"
  end

  create_table "drives", force: :cascade do |t|
    t.integer  "car_id", limit: 4
    t.string   "notes",      limit: 255
    t.string   "date",       limit: 255
    t.datetime "created_at",             null: false
    t.datetime "updated_at",             null: false
  end
end

三江源

编辑:

1 个答案:

答案 0 :(得分:0)

我认为这个问题是你想要链Car集合,但如果汽车在特定年份之前没有被驱动,则过滤掉。可能有几个驱动器&#39;在选定的年份中,您需要在驱动器发生的那一年汇总。

如果这是SQL,那将是:

select cars.* from cars inner join drives on drives.car_id = cars.id
  where YEAR(STR_TO_DATE(`drives.date`, "%m/%d/%Y")) = <some year>
  group by cars.id

虽然我不熟悉你的应用程序,但这可能有用:

Car.joins(:drives)
  .where('year(str_to_date(`drives.date`, "%m/%d/%Y")) = ?', year)
  .uniq # Need to do distinct cars.id otherwise duplicate records