簡體   English   中英

Rails從同一表查詢多個參數

[英]Rails Query Multiple Params From Same Table

如何搜索多個參數? 我的視圖中有復選框,因此如果選擇了多個復選框,則希望選擇所有已選擇的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]]

例如,如果要在單個列中搜索多個值

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

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

關於鏈接的更多討論Rails ActiveRecord如何在沒有多個查詢的情況下鏈接“ where”子句?

取決於要使用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')

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM