【发布时间】:2011-05-05 11:52:08
【问题描述】:
我试图通过提供一个通用的基础模型来概括我的一些模型,该基础模型包含一些相互的 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...)
显然,在 rails 中调用了父类的 named_scope,但在 rails 控制台中可以正常工作。有什么想法可以解决这个问题吗?谢谢。
【问题讨论】:
-
并不是说这可以解决您的问题,但是您应该为此使用模块混合而不是继承。继承适用于表示父类“类型”的子类。
-
实际上,@Beerlington,这可能会解决 OP 的问题,:)
标签: ruby-on-rails inheritance activerecord named-scope