Ruby on rails 如何在超类中创建类似attr setter的属性,并在子类中填充?
我在rails中有一个从ActiveRecord::Base继承的父类。我正试图在该类中实现freetext搜索和其他查询,以便所有从该类继承的类都可以将其与自己的字段一起使用,这些字段会根据模型进行更改:Ruby on rails 如何在超类中创建类似attr setter的属性,并在子类中填充?,ruby-on-rails,ruby,inheritance,activerecord,model,Ruby On Rails,Ruby,Inheritance,Activerecord,Model,我在rails中有一个从ActiveRecord::Base继承的父类。我正试图在该类中实现freetext搜索和其他查询,以便所有从该类继承的类都可以将其与自己的字段一起使用,这些字段会根据模型进行更改: # # in base class # class GenericBase < ActiveRecord::Base named_scope :freetext, lambda { |query| if query.present? { :conditions
#
# in base class
#
class GenericBase < ActiveRecord::Base
named_scope :freetext, lambda { |query|
if query.present?
{ :conditions => [ self.freetext_fields.join(' LIKE ? or '),
( ["%#{query}%"]*self.freetext_fields.size ) ].flatten }
else
{}
end
}
end
#
# in inheriting class
#
class Person < GenericBase
set_freetext_fields %w(firstname lastname username email)
end
# or
class Address < GenericBase
set_freetext_fields %w(street city)
end
#
# in controller
#
def search
@people = Person.freetext(params[:query])
end
#
#在基类中
#
类GenericBase[self.freetext_fields.join('LIKE?or'),
([“%#{query}%”]*self.freetext_fields.size)].flant}
其他的
{}
结束
}
结束
#
#在继承类中
#
类Person
在上面的示例中,如何实现set\u freetext\u字段
setter,以便在继承自GenericBase
的所有模型中轻松使用?这应该非常类似于Rails中提供的set\u table\u name
我想在父模块或mixin模块中实现它,以便继承类的API尽可能干净 您可以实现如下内容:
module A
def set_freetext_fields=(*args)
@a = args
end
def some_meth
@a
end
end
class C
extend A
C.set_freetext_fields = %w(firstname lastname username email)
end
puts C.set_freetext_fields
其中
C
是GenericBase
class是的,我很高兴我帮助了你。但有一件事我不能完全理解:如果在C类中调用set_freetext_字段而不使用显式C,那么您的作业在类外将不可见,我不明白为什么:)