[英]Nested scopes with rails 4
我有2個范圍:with_category和simple_search。 他們每個人都可以很好地工作,但在一起我無法確切獲得所需的東西。
product.rb
has_many :categorizations, :dependent => :destroy
has_many :categories, :through => :categorizations
scope :with_category, lambda { |category_slug|
return {} if category_slug.blank?
joins(:categorizations => :category).where('categorizations.category_id = ?', Category.find_by_slug(category_slug).id).uniq
}
scope :simple_search, lambda { |query|
return {} if query.blank?
where('"products"."name" ~* ? OR "products"."description" ~* ?', query, query)
}
products_controller.rb
def index
@products = Product.with_category(params[:category])
.simple_search(params[:query])
.paginate(:page => params[:page], :per_page => 10)
end
當我轉到localhost:3000/products?category=apple-laptops
我想獲取具有當前類別的所有產品。 取而代之的是,我的with_category范圍將被忽略,我可以看到所有產品。 不知道為什么會這樣。
從我的日志:
Product Load (0.9ms) SELECT "products".* FROM "products" LIMIT 10 OFFSET 0
Category Load (0.7ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 2]]
Category Load (0.8ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 4]]
Category Load (0.7ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 10]]
Category Load (0.8ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 5]]
Category Load (0.7ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 18]]
Category Load (0.7ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 1]]
Category Load (0.8ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 3]]
Category Load (0.7ms) SELECT "categories".* FROM "categories" INNER JOIN "categorizations" ON "categories"."id" = "categorizations"."category_id" WHERE "categorizations"."product_id" = $1 [["product_id", 15]]
您是否嘗試過像這樣更改范圍?
scope :with_category, lambda { |category_slug|
joins(:categorizations => :category).where('categorizations.category_id = ?', Category.find_by_slug(category_slug).id).uniq unless category_slug.blank?
}
scope :simple_search, lambda { |query|
where('"products"."name" ~* ? OR "products"."description" ~* ?', query, query) unless query.blank?
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.