2

すべてのモデルがアクセスできるメソッドをどこに追加すればよいかを理解するのに少し問題がありました。他の同様の投稿を読みましたが、どこに追加すればよいかよくわかりません。「/ lib」にモジュールとして追加し、モデルクラスに含めることについて述べた人もいます(運が悪い場合は、すでにこれを試してください)。では、これを追加するためのベストプラクティスは何ですか?

私は次のことを試みています:

私のモジュール: /lib/search.rb

module Search     
   def self.search(params,columns_search)
        srch = params[:search]

        if srch.blank?
          scoped
        else
          search= []
          #Add conditions for the search
          columns_search.map do |column|
            search << (sanitize_sql_for_conditions ["LOWER(CAST(#{column} as TEXT)) LIKE ?", "%#{srch.downcase}%"])
         end

          where("(#{conditions.join(" and ")})")

    end
end

私のモデルcars.rbで

class Cars < ActiveRecord::Base
  include Search

  attr_accessible :name

end

しかし、コンソールに次のエラーが表示されます。

2012-08-01 11:56:54 -0500 に 127.0.0.1 の GET "/cars" を開始しました

ActionController::RoutingError (初期化されていない定数 Car::Search): app/models/car.rb:2:in `'

どんな助けでも大歓迎です!:)

4

1 に答える 1

6

/libあなたが言及する手法は合理的なアプローチのようです-モデルに持たせたいメソッドを定義するモジュール(おそらくに存在する)を作成し、それを必要とする各モデルに含めます。

たとえば、私の現在のプロジェクトには画像、ビデオ、およびオーディオがあり、それらはすべてメディアの種類であるため、これらすべてに利用できる特定のメソッドがあります。でモジュールを定義しますlib/media.rb

module Media
  def self.included(base)
    # Associations etc. go here
    base.has_many :things
    base.mount_uploader :image, ImageUploader
    base.attr_accessible :image
    base.before_save :do_something
  end

  def do_something(argument=nil)
    #stuff
  end

end

そして、各メディア モデルに次のように含めます。

class Video < ActiveRecord::Base
  include Media

end

Video.first.do_somethingメソッドがモデルで定義されているかのように、を呼び出すことができます。

于 2012-08-01T16:42:12.890 に答える