现在做一个全文检索的功能,需要在model加上这么一段代码:
我有多个model需要加上全文检索的功能,现在的做法是在每个model都cp这段代码过去,cp的坏处也就不多说了。
因为每个model都是自ActiveRecord::Base继承而来,而且ruby有强大的open class功能,应该是可以这样的:
新建一个open_ar.rb文件
这样当可以一劳永逸。
那么在rails的目录结构中,我新建的这个open_ar.rb文件,应该放在那个目录下呢?
我是想遵循rails默认的目录结构来放置这个文件。
我想应该有不少DX会hack一下rails代码的吧,不过没找到过相关的资料。那位兄弟知道的话,请留言告之,感激不尽...
我觉得可行的做法是放到lib下:
RAILS_ROOT/lib/open_ar.rb
然后在 RAILS_ROOT/config/initializers/new_rails_defaults.rb中
这样配置rails启动即加载此文件,达到增强AR,减少重复代码的效果。
此法纯粹是YY,未经实践,切忽模仿。
明晚实践一下这个做法。
def self.full_text_search(q, options = {})
return nil if q.nil? or q==""
default_options = {:limit => 10, :page => 1}
options = default_options.merge options
# get the offset based on what page we're on
options[:offset] = options[:limit] * (options.delete(:page).to_i-1)
results = this.find_by_contents(q, options)
end
我有多个model需要加上全文检索的功能,现在的做法是在每个model都cp这段代码过去,cp的坏处也就不多说了。
因为每个model都是自ActiveRecord::Base继承而来,而且ruby有强大的open class功能,应该是可以这样的:
新建一个open_ar.rb文件
module ActiveRecord
class Base
def self.full_text_search(q, options = {})
return nil if q.nil? or q==""
default_options = {:limit => 10, :page => 1}
options = default_options.merge options
# get the offset based on what page we're on
options[:offset] = options[:limit] * (options.delete(:page).to_i-1)
results = this.find_by_contents(q, options)
end
end
end
这样当可以一劳永逸。
那么在rails的目录结构中,我新建的这个open_ar.rb文件,应该放在那个目录下呢?
我是想遵循rails默认的目录结构来放置这个文件。
我想应该有不少DX会hack一下rails代码的吧,不过没找到过相关的资料。那位兄弟知道的话,请留言告之,感激不尽...
我觉得可行的做法是放到lib下:
RAILS_ROOT/lib/open_ar.rb
然后在 RAILS_ROOT/config/initializers/new_rails_defaults.rb中
require "lib/open_ar"
这样配置rails启动即加载此文件,达到增强AR,减少重复代码的效果。
此法纯粹是YY,未经实践,切忽模仿。
明晚实践一下这个做法。