【发布时间】:2019-10-25 13:54:07
【问题描述】:
我正在做一个看起来像这样的简单搜索(有 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
当我只有一个“开启”参数并返回在参数中包含服务的事件时,查询工作正常。
但是,如果我有两个“开启”参数,即使我的事件有这两种服务,它也不再起作用了。
我已经在控制台中对其进行了测试,我可以看到如果我对之前已经加入的元素执行 .joins(:services).where(services: { name: "big" }) ,它什么都不返回。
我不明白为什么。
第一个@events(当一个参数时)返回一个包含一些事件的活动记录关系。
为什么我不能对其进行另一个 .joins 操作?
我真的不明白这个查询有什么问题,为什么它一加入两次就变成空的。
非常感谢
【问题讨论】:
-
原因是因为你的
where链接会在Sql查询中生成AND子句,比如WHERE services.name = "old" AND services.name = "big",这个在你的数据库中是不存在的。 -
我认为您的意图是使用
OR而不是AND,对吗? -
嗯,我想我确实想要一个 AND。如果我只有一个参数,比如说“大”,我希望所有事件都具有“大”作为服务。但是一个事件可以有很多服务。因此,如果用户放置两个参数,“大”和“旧”,我希望所有事件都具有“大”和“旧”作为服务......当我在控制台中查看时确实存在
-
如果我确实想要一个 AND 并且如果我有一个包含两种服务的事件,它应该可以工作吗?我错过了什么?
-
不,这行不通。因为您的两个服务共享相同的名称变量。您将同时执行“name == big”和“name == old”,但它们不能同时相等。
标签: ruby-on-rails activerecord parameters active-record-query