我的网站上有一个页面,允许人们根据一系列标准过滤汽车。这些标准通过参数传递。
我想添加一个新标准,但模型中执行此操作的逻辑是一种方法。我无法将其添加到我的控制器过滤逻辑中,因为这完全基于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
三江源
编辑:
答案 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