Любой возможный способ добавить параметры в предложение ON для включения левых соединений на рельсах?
У меня есть огромный сложный запрос, как это:
@objects = Object.joins({ x: :y }).includes(
[:s, { x: { y: :z } }, { l: :m },:q, :w,
{ important_thing:
[:h, :v, :c,:l, :b, { :k [:u, :a] }]
}
]).where(conditions).order("x.foo, x.bar")
Тогда я хочу показать все Objects
и только Important_things
которые были созданы между двумя датами.
Если я положу это там where
пункт я не понимаю все Objects
, только Objects
который имеет Important_things
между информированными датами.
Решение, использующее raw sql, было таким:
select * from objects left join important_things on important_things.object_id = objets.id and important_things.created_at between 'x' and 'y'
Вместо:
select * from objects left join important_things on important_things.object_id = objets.id where important_things.created_at between 'x' and 'y'
Мне действительно нужны все эти объекты, и я не хочу использовать необработанный SQL, любой обходной путь или возможность передачи параметров в ON
пункт об ассоциации?
2 ответа
Я сделал уродливый обходной путь:
class Parent < ActiveRecord::Base
cattr_accessor :dt_begin, dt_end
has_many :children, conditions: Proc.new { { created_at: (@@dt_begin..@@dt_end) } }
end
class MetasController < ApplicationController
def index
Parent.dt_begin = Date.parse(param[:dt_begin])
Parent.dt_end = Date.parse(param[:dt_end])
@parents = Parent.includes(:children).where("children.age = ?", params[:age])
end
end
Таким образом, я получаю все Parents
даже если у меня нет Children
create_at между указанными датами.
И самая важная часть этого у меня есть все объекты внутри ActiveRecord.
Но будьте осторожны, потому что я перепутал с cattr_accessor, поэтому мне приходится устанавливать каждый раз перед поиском Parents
,
Я сделаю это,
class VendorsRatings < ActiveRecord::Base
def self.ratings(v_ids,sort = "DESC")
joins("RIGHT OUTER JOIN vendors_lists v
ON v.vendor_id = vendors_ratings.vendor_id").where(conditions)
end
end