2014-12-29 2 views
0

Я пытаюсь сделать один супер класс записи со всеми моими Общин методами:Как сделать супер запись объекта?

class BaseRecord < ActiveRecord::Base 
def initialize 

end 


def self.search_by_filter(parameters) 
    filter = [] 

    parameters.each do |key, param| 
    if self.attributes.has_key?(key) 
     filter[key] = param 
    end 
    end 

    self.where(filter)  
end 

но когда я использую этот подкласс,

class Item < BaseRecord 
end 

и я использую класс на контроллере, а методы суперкласса, как только метод ActiveRecord, например, когда (Item.when (: name => "item)), запись не работает, просто скажите, что base_record не выходит. Только метод ActiveRecord не работает Работа

ответ

2

ActiveRecord не предназначен для работы с подклассов, по крайней мере, не так, как можно было бы ожидать. Подкласс в ActiveRecord зарезервирован для определенных типов шаблонов, таких как STI (Single Table Inheritance).

Вы можете добиться результата с помощью подкласса, но для этого потребуется declare the BaseRecord as abstract.

self.abstract_class = true 

Мое предложение - предпочесть композицию с использованием смесина. Определите настраиваемый модуль, например

module Searchable 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def search_by_filter(parameters) 
     filter = [] 

     parameters.each do |key, param| 
     if self.attributes.has_key?(key) 
      filter[key] = param 
     end 
     end 

     self.where(filter)  
    end 
    end 
end 

и включить его в классы, которые вы хотите расширить.

class Item < BaseRecord 
    include Searchable 
end 
0

Вы должны реализовать его как абстрактный класс:

class BaseRecord 
    self.abstract_class = true 
    # ... 
end 
0

Подклассы BaseRecord будет хранить записи в таблице base_records (по умолчанию). Вам не нужна таблица items в вашем случае.

Смежные вопросы