我試圖通過提供一個通用的基礎模型來繼承一些我的模型,該模型包含一些相互的named_scope聲明和一個過濾器方法,用於激活在控制器端更簡單的查詢。這似乎當我在控制檯中運行其上工作,但未能在控制器中時:Rails的named_scope繼承?
# in the base model
class GenericModel < ActiveRecord::Base
named_scope :by_name, lambda { |name|
(name.blank?) ? {} : { :conditions => [ "#{self.table_name}.name like ?", "%#{name}%" ] }
}
def filter(params)
res = []
res = self.by_name((params[:name] or '')) if params[:name]
return res
end
end
class MyModel < GenericModel
set_table_name 'my_models'
end
# works in in console!
>> params = { :name => 'jimmy' }
>> MyModel.filter(params)
=> [ <#MyModel ...>, ... ]
nil
# fails in controller
@model = MyModel.filter(params)
# ActiveRecord::StatementInvalid (Mysql::Error Unknown column 'generic_models.name' in where clause...)
顯然父類named_scope被稱爲軌道的時候,但工作在軌控制檯罰款。任何想法如何修補這個?謝謝。
這不是說這可以解決你的問題,但是你應該使用模塊mixins代替繼承。繼承適用於代表父類「類型」的子類。 – 2011-05-05 12:37:30
其實,@Beerlington,可能解決OP的問題:) – 2011-05-05 13:39:43