ActiveRecord:: основа без таблицы

UPD : теперь это часть ES2018.

Его можно немного улучшить с помощью нестандартизированного и все же синтаксиса распространения свойств . :

return {
    ...state,
    notificationBar: {
        ...state.notificationBar,
        open: true,
    },
};

22
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Это подход, который я использовал в прошлом:

В 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>>
39
ответ дан 29 November 2019 в 03:31
поделиться

Я нашел эту ссылку, которая работает КРАСИВО.

http://codetunes.com/2008/07/20/tableless-models-in-rails/

4
ответ дан 16 October 2019 в 03:31
поделиться

Validations are simply a module within ActiveRecord. Have you tried mixing them into your non-ActiveRecord model?

class MyModel
  include ActiveRecord::Validations

  # ...
end
17
ответ дан 29 November 2019 в 03:31
поделиться

ОБНОВЛЕНИЕ: Для 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».

7
ответ дан 29 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: