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

在我的模型car.rb

class Cars < ActiveRecord::Base
  include Search

  attr_accessible :name

end

但我在控制台上收到以下错误:

在 2012-08-01 11:56:54 -0500 开始为 127.0.0.1 获取“/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 回答