【问题标题】:Rails Query Multiple Params From Same TableRails 从同一个表中查询多个参数
【发布时间】:2018-01-07 03:02:35
【问题描述】:

如何搜索多个参数?我的视图中有复选框,所以如果选择了多个复选框,我希望选择所有 params。我目前只能使用下面的代码使用param 进行搜索。

car 模型和 colour_collection 模型之间存在 has_manyhas_many 关联。

控制器:

@cars = car.joins(:colour_collections).where("colour_collections.name = ?", params[:colour_collection])

如果选择了两种颜色(例如红色和绿色)在结果查询中创建重复项,则日志会显示这一点:

(0.7ms)  SELECT COUNT(*) FROM "colour_collections"
  ColourCollection Load (0.5ms)  SELECT "colour_collections".* FROM "colour_collections"
  Car Load (2.5ms)  SELECT "cars".* FROM "cars" INNER JOIN "car_colour_collections" ON "car_colour_collections"."car_id" = "cars"."id" INNER JOIN "colour_collections" ON "colour_collections"."id" = "car_colour_collections"."colour_collection_id" WHERE "colour_collections"."name" IN ('Subtle', 'Intermediate') ORDER BY "cars"."created_at" DESC
  CarAttachment Load (0.5ms)  SELECT  "car_attachments".* FROM "car_attachments" WHERE "car_attachments"."car_id" = $1 ORDER BY "car_attachments"."id" ASC LIMIT $2  [["car_id", 21], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT  "car_attachments".* FROM "car_attachments" WHERE "car_attachments"."car_id" = $1 ORDER BY "car_attachments"."id" ASC LIMIT $2  [["car_id", 21], ["LIMIT", 1]]
  CarAttachment Load (0.5ms)  SELECT  "car_attachments".* FROM "car_attachments" WHERE "car_attachments"."car_id" = $1 ORDER BY "car_attachments"."id" ASC LIMIT $2  [["car_id", 20], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT  "car_attachments".* FROM "car_attachments" WHERE "car_attachments"."car_id" = $1 ORDER BY "car_attachments"."id" ASC LIMIT $2  [["car_id", 20], ["LIMIT", 1]]

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    例如,如果您想在单个列中搜索多个值

    params[:colour_collection] = ['red','green','blue'] 
    

    那么你会期望你的查询看起来像这样

    SELECT * FROM cars c 
    INNER JOIN colour_collections s 
    WHERE s.name IN ('red','green','blue');
    

    在这种情况下,相应的 ActiveRecord 语句将如下所示

    Car.
    joins(:colour_collections).
    where(colour_collections: { name: params[:colour_collection] })
    

    【讨论】:

    • 正是我想要的。谢谢。问题 - 我目前在视图中获取每个项目的重复项 - 所以如果项目同时具有属性颜色“绿色”和“蓝色”并且在一个查询中搜索两种颜色,我认为它显示两次,因为一个返回绿色结果和其他正在返回蓝色结果。
    • 您能否更新您的问题以分享与您正在谈论的场景相关的数据表示例?
    • 好的 - 刚刚添加。
    • 我的意思是存储在您的表中的数据示例。几行可能
    【解决方案2】:

    Rails 5 带有 or 方法,但 Rails 4 没有 or 方法,因此您可以在 Rails 4 中使用纯 SQL 查询。

    在 Rails 4 中:

    @cars = car.
            joins(:colour_collections).
            where("colour_collections.name = ? or colour_collections.type = ?", params[:colour_collection], params[:type])
    

    在 Rails 5 中:

    @cars = car.
            joins(:colour_collections).
            where("colour_collections.name = ?", params[:colour_collection]).or(car.joins(:colour_collections).where("colour_collections.type = ?", params[:type]))
    

    【讨论】:

      【解决方案3】:

      取决于您是要使用OR 还是AND。有多种方法可以实现这一点,但简单的例子是

      Article.where(trashed: true).where(trashed: false)
      生成的 sql 将是
      SELECT * FROM articles WHERE 'trashed' = 1 AND 'trashed' = 0

      Foo.where(foo: 'bar').or.where(bar: 'bar') 这是 Rails 5 中的标准,或者只是
      Foo.where('foo= ? OR bar= ?', 'bar', 'bar')

      【讨论】:

      • 搜索同一个表/列两次是否重要。所以不是Foo.where('foo= ? OR bar= ?', 'bar', 'bar'),而是Foo.where('foo= ? OR foo= ?', 'bar', 'bar')。我已经尝试使用params[:colour_collection] 作为参数('bar')并收到Invalid Statement 的错误消息。当我尝试#{params[:colour_collection]} 时,它终于可以工作了,但仍然只搜索一项。有什么想法吗?
      • 所以基本上有人可以通过选中 2 个框来搜索 2 种颜色。
      【解决方案4】:

      @cars = car.joins(:colour_collections).where("colour_collections.name = ?", params[:colour_collection]).where("cars.make = ?", params[:make])

      更多关于链接How does Rails ActiveRecord chain "where" clauses without multiple queries?的讨论

      【讨论】:

      • 搜索同一个表/列是否重要,这意味着在您的示例中,有 colour_collectionmake - 我正在寻找是否有人选择 2 种颜色。我试过了,但什么都没有……这就是我试过的@w_artisans = car.joins(:colour_collections).where("colour_collections.name = ?", params[:colour_collection]).where("colour_collections.name = ?", params[:colour_collection]) - 我收到这个错误PG::DatatypeMismatch: ERROR: argument of AND must be type boolean, not type record 有什么想法吗?
      猜你喜欢
      • 2010-10-13
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2015-04-30
      • 1970-01-01
      • 2013-12-14
      相关资源
      最近更新 更多