UPD : теперь это часть ES2018.
Его можно немного улучшить с помощью нестандартизированного и все же синтаксиса распространения свойств . :
return {
...state,
notificationBar: {
...state.notificationBar,
open: true,
},
};
Это подход, который я использовал в прошлом:
В 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
В script / console
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>>
Validations are simply a module within ActiveRecord. Have you tried mixing them into your non-ActiveRecord model?
class MyModel
include ActiveRecord::Validations
# ...
end
ОБНОВЛЕНИЕ: Для Rails 3 это можно сделать очень просто. В Rails 3+ вы можете использовать новый модуль ActiveModel
и его подмодули. Теперь это должно работать:
class Tableless
include ActiveModel::Validations
attr_accessor :name
validates_presence_of :name
end
Для получения дополнительной информации, вы можете проверить Railscast (или прочитать об этом на AsciiCasts ) по теме, а также это сообщение в блоге Иегуды Каца .
OLD ОТВЕТ СЛЕДУЕТ:
Возможно, вам потребуется добавить это к решению, предложенному Джоном Топли в предыдущем комментарии:
class Tableless
class << self
def table_name
self.name.tableize
end
end
end
class Foo < Tableless; end
Foo.table_name # will return "foos"
Это дает вам "поддельное" имя таблицы, если оно вам нужно. Без этого метода Foo :: table_name
будет оцениваться как «tablelesses».