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]]