Ruby on rails 如何在超类中创建类似attr setter的属性,并在子类中填充?

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

我在rails中有一个从ActiveRecord::Base继承的父类。我正试图在该类中实现freetext搜索和其他查询,以便所有从该类继承的类都可以将其与自己的字段一起使用,这些字段会根据模型进行更改:

#
# 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,那么您的作业在类外将不可见,我不明白为什么:)