activerecord 多次加入相同 table
activerecord joins multiple time the same table
我正在做一个简单的搜索,看起来像这样(有 8 个不同的参数,但我会复制 2 个只是为了举例)
if params[:old] == "on"
@events = @events.joins(:services).where(services: { name: "old" })
end
if params[:big] == "on"
@events = @events.joins(:services).where(services: { name: "big" })
end
当我只有一个参数 "on" 和 returns 我的事件在参数中有服务时,查询工作正常。
但是如果我有两个参数 "on",即使我的活动有两个服务,它也不再工作了。
我已经在控制台中对其进行了测试,我可以看到如果我对已经存在的元素执行 .joins(:services).where(services: { name: "big" })之前加入过,returns没什么。
我不明白为什么。
第一个@events (when one param) returns 一个活动记录关系,里面有一些事件。
为什么我不能在上面做另一个 .joins?
我真的不明白这个查询有什么问题,为什么一加入两次就变空了。
非常感谢
您使用的代码将转换为:
SELECT "events".* FROM "events" INNER JOIN "services" ON "services"."event_id" = "events"."id" WHERE "services"."name" = ? AND "services"."name" = ? LIMIT ? [["name", "big"], ["name", "old"], ["LIMIT", 11]]
这就是returns零记录的原因。
这是我目前能想到的解决方案,不确定它是否是理想的,但是是的,它有效并且已经过测试。
# event.rb
class Event < ApplicationRecord
has_many :services
has_many :old_services, -> { where(name: 'old') }, class_name: 'Service'
has_many :big_services, -> { where(name: 'big') }, class_name: 'Service'
end
# service.rb
class Service < ApplicationRecord
belongs_to :event
end
而你的搜索方法可以这样写:
if params[:old] == "on"
@events = @events.joins(:old_services)
end
if params[:big] == "on"
@events = @events.joins(:big_services)
end
@events = @events.distinct
# SELECT DISTINCT "events".* FROM "events" INNER JOIN "services" ON "services"."event_id" = "events"."id" AND "services"."name" = ? INNER JOIN "services" "old_services_events" ON "old_services_events"."event_id" = "events"."id" AND "old_services_events"."name" = ? LIMIT ? [["name", "big"], ["name", "old"], ["LIMIT", 11]]
我正在做一个简单的搜索,看起来像这样(有 8 个不同的参数,但我会复制 2 个只是为了举例)
if params[:old] == "on"
@events = @events.joins(:services).where(services: { name: "old" })
end
if params[:big] == "on"
@events = @events.joins(:services).where(services: { name: "big" })
end
当我只有一个参数 "on" 和 returns 我的事件在参数中有服务时,查询工作正常。
但是如果我有两个参数 "on",即使我的活动有两个服务,它也不再工作了。
我已经在控制台中对其进行了测试,我可以看到如果我对已经存在的元素执行 .joins(:services).where(services: { name: "big" })之前加入过,returns没什么。
我不明白为什么。
第一个@events (when one param) returns 一个活动记录关系,里面有一些事件。
为什么我不能在上面做另一个 .joins?
我真的不明白这个查询有什么问题,为什么一加入两次就变空了。
非常感谢
您使用的代码将转换为:
SELECT "events".* FROM "events" INNER JOIN "services" ON "services"."event_id" = "events"."id" WHERE "services"."name" = ? AND "services"."name" = ? LIMIT ? [["name", "big"], ["name", "old"], ["LIMIT", 11]]
这就是returns零记录的原因。
这是我目前能想到的解决方案,不确定它是否是理想的,但是是的,它有效并且已经过测试。
# event.rb
class Event < ApplicationRecord
has_many :services
has_many :old_services, -> { where(name: 'old') }, class_name: 'Service'
has_many :big_services, -> { where(name: 'big') }, class_name: 'Service'
end
# service.rb
class Service < ApplicationRecord
belongs_to :event
end
而你的搜索方法可以这样写:
if params[:old] == "on"
@events = @events.joins(:old_services)
end
if params[:big] == "on"
@events = @events.joins(:big_services)
end
@events = @events.distinct
# SELECT DISTINCT "events".* FROM "events" INNER JOIN "services" ON "services"."event_id" = "events"."id" AND "services"."name" = ? INNER JOIN "services" "old_services_events" ON "old_services_events"."event_id" = "events"."id" AND "old_services_events"."name" = ? LIMIT ? [["name", "big"], ["name", "old"], ["LIMIT", 11]]