在Rails中对Globalize3表进行简单搜索

时间:2012-08-22 00:08:16

标签: ruby-on-rails ruby-on-rails-3 search globalize3

我希望在Ruby on Rails上使用globalize3 gem时实现一个简单的搜索功能。由于模型的转换存储在单独的表中,因此下面的代码不起作用,因为products表中不再有:name字段。如何调整下面的代码以使搜索功能正确?

products_controller.rb

 @products = Product.search(params[:search]).all

index.html.erb

 <%= form_tag products_path, method: :get do %>   
   <%= text_field_tag :search, params[:search] %>
   <%= submit_tag "Search", name: nil %>      
 <% end %>

模型

class Product < ActiveRecord::Base
  translates :name
  attr_accessible :name, :price, :released_at

  def self.search(search)
    if search
      where('name LIKE ?', "%#{search}%")
    else
      scoped
    end
  end
end

2 个答案:

答案 0 :(得分:14)

你很幸运,我最近解决了同样的问题!

幸运的是,答案很简单。您可以使用类方法with_translations来包含给定语言环境集的翻译。

以下是代码:

def with_translations(*locales)
  locales = translated_locales if locales.empty?
  includes(:translations).with_locales(locales).with_required_attributes
end

将其包含在search方法中:

def self.search(search)
  if search
    with_translations.where('name LIKE ?', "%#{search}%")
  else
    with_translations
  end
end

应该这样做。

作为补充说明:您可以在搜索方法中添加一个可选的locales参数,并将其传递给with_translations,以选择性地将搜索范围缩小到特定语言的条件,例如在当前区域设置。

答案 1 :(得分:0)

已解决...

    def index
        if params[:search]
          @at = []
          @at = Array.new
          Article.translation_class.where("title LIKE ? OR description LIKE ?","%#{params[:search]}%","%#{params[:search]}%").all.each do |t|
            @at.push t.article_id
          end
          @articles = Article.where(id: @at).recent_first.paginate(page: params[:page], per_page: 5)
        else
          @articles = Article.all.recent_first.paginate(page: params[:page], per_page: 5)
        end
      end