Я думаю сообщение в блоге, которое Вы связываете, лучший способ пойти. Я только предложил бы переместить погашенные методы в модуль для не загрязнения кода.
Это - подход, который я использовал в прошлом:
В app/models/tableless.rb
class Tableless < ActiveRecord::Base
def self.columns
@columns ||= [];
end
def self.column(name, sql_type = nil, default = nil, null = true)
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default,
sql_type.to_s, null)
end
# Override the save method to prevent exceptions.
def save(validate = true)
validate ? valid? : true
end
end
В app/models/foo.rb
class Foo < Tableless
column :bar, :string
validates_presence_of :bar
end
В сценарий/консоль
Loading development environment (Rails 2.2.2)
>> foo = Foo.new
=> #<Foo bar: nil>
>> foo.valid?
=> false
>> foo.errors
=> #<ActiveRecord::Errors:0x235b270 @errors={"bar"=>["can't be blank"]}, @base=#<Foo bar: nil>>
просто создайте новый файл, заканчивающийся в ".rb" в соответствии с соглашениями, к которым Вы привыкли (исключительный для имени файла и имени класса, подчеркнул для имени файла, Camel-регистра для имени класса) на Ваших "моделях /" каталог. Ключ здесь не должен наследовать Вашу модель от ActiveRecord (потому что это - AR, который дает Вам функциональность базы данных). например: для новой модели для автомобилей создайте файл, названный "car.rb" в Ваших моделях / каталог и в Вашей модели:
class Car
# here goes all your model's stuff
end
редактирование: btw, если Вы хотите атрибуты на своем классе, можно использовать здесь все, что Вы используете на рубине, просто добавляете пару строк с помощью "attr_accessor":
class Car
attr_accessor :wheels # this will create for you the reader and writer for this attribute
attr_accessor :doors # ya, this will do the same
# here goes all your model's stuff
end
редактирование № 2: после чтения комментария Mike's я сказал бы Вам идти его путем, если Вы хотите всю функциональность ActiveRecord, но никакую таблицу на базе данных. Если Вы просто захотите обычный класс Ruby, возможно, Вы найдете это решение лучше;)
Существует экранная демонстрация о неактивной модели Record, составленной Ryan Bates. Хорошее место для запуска с.
На всякий случай Вы уже не наблюдали его.
Что относительно того, чтобы отметить класс как краткий обзор?
class Car < ActiveRecord::Base
self.abstract = true
end
это скажет направляющим, что Автомобильный класс не имеет никакой соответствующей таблицы.
[редактирование]
это действительно не поможет Вам, если необходимо будет сделать что-то как:
my_car = Car.new
Кто-либо когда-либо пытался включать ActiveRecord::Validations
и ActiveRecord::Validations::ClassMethods
в неактивном Рекордном классе и видеть то, что происходит при попытке установить блоки проверки допустимости?
я уверен, что существует много зависимостей между платформой проверки и самим ActiveRecord. Но можно преуспеть в том, чтобы избавиться от тех зависимостей путем разветвления собственной платформы проверки от платформы проверки AR.
Просто идея.
Обновление : oopps, это более или менее, что предлагается в сообщении, связанном с Вашим вопросом. Извините за волнение.
Любите Tiago Pinto, сказал, и просто не имейте своей модели, наследовались ActiveRecord:: Основа. Это просто будет регулярный класс Ruby, что Вы всовываете файл в своем app/models/каталоге. Если ни одна из Ваших моделей не имеет таблицы, и Вы не используете базу данных или ActiveRecord вообще в Вашем приложении, несомненно, изменят Ваш environment.rb файл для имения следующей строки:
config.frameworks -= [:active_record]
Это должно быть в Rails::Initializer.run do |config|
блок.
Используйте Validatable gem. Как вы говорите, существуют решения на основе AR, но они, как правило, хрупкие.
Вам следует проверить плагин PassiveRecord . Он дает вам интерфейс, подобный ActiveRecord, для моделей, не связанных с базами данных. Это просто и меньше хлопот, чем борьба с ActiveRecord.
Мы используем PassiveRecord в сочетании с гемом Validatable , чтобы получить желаемое поведение OP.
Я создал быстрый Mixin для обработки этого, согласно предложению Джона Топли.