代码之家  ›  专栏  ›  技术社区  ›  maček

有没有更好的方法来编写这个命名的\u范围?[轨道]

  •  0
  • maček  · 技术社区  · 14 年前

    我使用这个命名的\范围来搜索描述与用户输入的任何单词匹配的产品。

    例如。, Product.description_like_any("choc pret")

    • “巧克力椒盐卷饼”
    • “迷你巧克力小马”

    named_scope :description_like_any, (lambda do |query|
      return {} unless query
      conditions = []
      values = []
      for q in query.split(/\s+/)
        conditions << "(`products`.description LIKE ?)"
        values << "%#{q}%"
      end
      { :conditions => [conditions.join(' AND '), *values] }
    end)
    

    有没有更好的方法写这个?也许我错过了一两个红宝石主义/铁路主义?

    使用 scope_procedure _or_ :keywords scope\u过程查找匹配的产品 product.description product.vendor.name ;全部包含一个文本字段!

    # app/models/product.rb
    class Product < ActiveRecord::Base
      scope_procedure :keywords, lambda |query|
        description_like_any_or_vendor_name_like_any(query.split(/\s+/))
      end
    end
    

    控制器

    # app/controllers/products_controller.rb
    class ProductsController < ApplicationController
      def index
        @search = Product.search(params[:search])
        @products = @search.all
      end
    end
    

    意见

    # app/views/products/index.html.erb
    <% form_for @search do |f| %>
      <%= f.label :keywords, "Quick Search" %>
      <%= f.input :keywords %>
      <%= f.submit, "Go" %>
    <% end %>
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Dave Pirotte    14 年前

    Searchlogic 宝石将创造 description_like_any 你的范围。

    class Product < ActiveRecord::Base
       # ...
       scope_procedure :description_like_any_term, lambda { |terms| 
         name_like_any(terms.split(/\s+/))
       }
       # ...
    end