【问题标题】:Nested scopes with rails 4带导轨的嵌套范围 4
【发布时间】:2014-03-11 09:42:37
【问题描述】:

我有 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]]

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 scope named-scope


    【解决方案1】:

    您是否尝试过像这样更改您的范围?

    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?
    }
    

    【讨论】:

    • 有效!!!非常感谢!也许您有一些想法,为什么我的代码没有按应有的方式工作?
    • 我猜,从范围返回 {} 会破坏链条。因此,在此返回之后,链会重新开始,并且您之前的方法将被忽略。
    • 我明白了...再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多