我正在使用 active_admin 并将 meta_search 引入我的项目。(我不想用于其他任何事情)。
它似乎在我所有的模型上定义了搜索方法,这意味着当我包含轮胎时,我不能使用它的搜索方法。
它如何定义方法似乎也有些奇怪 - method_defined?说搜索方法没有定义,但是当我调用它时,我得到了 meta_search 一个。即使我在类中定义了自己的搜索方法,当我调用 Document.search 时,我仍然会得到 meta_search。
编辑:我会对处理这类事情的一般方法感兴趣 - 我已经通过使用 Model.tire.search 解决了这个特殊问题(因为轮胎也可以通过这种方式访问),但我仍然讨厌我的宝石我什至不使用都可以迫使我在项目的其余部分中使用解决方法。
编辑:我不知道在答案的答案中包含代码块的好方法,所以我会把它放在这里。
# Meta_search loaded, tire is not
1.9.3p125 :001 > require "tire" #=> true
1.9.3p125 :002 > Document.send(:include, Tire::Model::Search)
=> Document(...)
1.9.3p125 :003 > Document.search
Document Load (2.1ms) SELECT "documents".* FROM "documents"
# I get meta_search, as I should
# Tire loaded (and the include Tire::Model::Search is inside the class definition), meta_search is not loaded
1.9.3p125 :001 > Document.search
# I get tire, as I should
1.9.3p125 :002 > require "meta_search" #=> true
1.9.3p125 :003 > Document.search
# I still get tire, all is well
# Tire loaded, meta_search is not loaded
1.9.3p125 :001 > require "meta_search" #=> true
1.9.3p125 :002 > Document.search
Document Load (1.8ms) SELECT "documents".* FROM "documents"
# I get meta_search, even though Document.search was already defined!
# Tire loaded, meta_search is not loaded, RAILS_ENV="production"
Loading production environment (Rails 3.2.2)
1.9.3p125 :001 > require "meta_search"
=> true
1.9.3p125 :002 > Document.search
# I get tire!
我对此的解释是,meta_search 如何在类尚未实际加载时检测是否已定义搜索存在错误。万岁!