[英]Rails Query Multiple Params From Same Table
如何搜索多個參數? 我的視圖中有復選框,因此如果選擇了多個復選框,則希望選擇所有已選擇的params
。 我目前只能使搜索與下面的代碼一起使用一個param
。
car
模型和colour_collection
模型之間存在has_many
至has_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])
取決於要使用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.