나는 상호 기본 모델을 제공하여 일부 모델을 일반 named_scope 선언과 컨트롤러 측면에서 더 간단한 쿼리를 활성화하는 필터 메소드를 포함하여 일반화하려고합니다. 이것은 내가 콘솔에서 실행할 때 작동하는 것처럼 보이지만 때 컨트롤러에 실패Rails의 named_scope 상속은 무엇입니까?
분명히 부모 클래스 '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...)
. 어떤 생각을 고쳐야 할까? 감사.
이 방법으로 문제가 해결되지는 않지만이를 위해 상속 대신 모듈 mixins을 사용해야합니다. 상속은 부모 클래스의 "유형"을 나타내는 하위 클래스를 대상으로합니다. –
사실, @Beerlington, 그건 OP의 문제를 해결할 수 있습니다 :) –