Как создать свойство атрибута сеттера как свойство в суперклассе и заполнить его в подклассах? - PullRequest
0 голосов
/ 15 мая 2011

У меня есть родительский класс в рельсах, который наследуется от ActiveRecord :: Base.Я пытаюсь реализовать поиск в свободном тексте и другие запросы в этом классе, чтобы все классы, наследующие его, могли использовать его со своими собственными полями, которые меняются в зависимости от модели:

#
# 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

ВВ приведенном выше примере, как мне реализовать установщик set_freetext_fields, чтобы его можно было легко использовать во всех моделях, наследуемых от GenericBase?Это должно быть что-то очень похожее на set_table_name, доступный в Rails.

Я хочу реализовать его в родительском или смешанном модуле так, чтобы API для наследования классов был максимально чистым.

1 Ответ

1 голос
/ 15 мая 2011

Вы можете реализовать что-то вроде этого:

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 класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...