6

Ruby onRails用のglobalize3gemを使用しながら、簡単な検索機能を実装したいと考えています。モデルの変換は別のテーブルに保存されているため、製品テーブルに: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
4

2 に答える 2

16

あなたは幸運です、私は最近まったく同じ問題に取り組みました!

幸いなことに、答えは非常に簡単です。classメソッド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、オプションで特定の言語、たとえば現在のロケールの用語に検索を絞り込むことができます。

于 2012-08-22T00:39:30.663 に答える
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
于 2020-04-11T12:11:06.257 に答える