Модель Rails без базы данных

66
задан Peter Coulton 4 September 2011 в 18:45
поделиться

10 ответов

Я думаю сообщение в блоге, которое Вы связываете, лучший способ пойти. Я только предложил бы переместить погашенные методы в модуль для не загрязнения кода.

8
ответ дан Honza 24 November 2019 в 14:53
поделиться

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

В 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>>
43
ответ дан John Topley 24 November 2019 в 14:53
поделиться

просто создайте новый файл, заканчивающийся в ".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, возможно, Вы найдете это решение лучше;)

8
ответ дан tpinto 24 November 2019 в 14:53
поделиться

Существует экранная демонстрация о неактивной модели Record, составленной Ryan Bates. Хорошее место для запуска с.

На всякий случай Вы уже не наблюдали его.

4
ответ дан Laurent Farcy 24 November 2019 в 14:53
поделиться

Что относительно того, чтобы отметить класс как краткий обзор?

class Car < ActiveRecord::Base
  self.abstract = true
end

это скажет направляющим, что Автомобильный класс не имеет никакой соответствующей таблицы.

[редактирование]

это действительно не поможет Вам, если необходимо будет сделать что-то как:

my_car = Car.new
2
ответ дан Mike Breen 24 November 2019 в 14:53
поделиться

Кто-либо когда-либо пытался включать ActiveRecord::Validations и ActiveRecord::Validations::ClassMethods в неактивном Рекордном классе и видеть то, что происходит при попытке установить блоки проверки допустимости?

я уверен, что существует много зависимостей между платформой проверки и самим ActiveRecord. Но можно преуспеть в том, чтобы избавиться от тех зависимостей путем разветвления собственной платформы проверки от платформы проверки AR.

Просто идея.

Обновление : oopps, это более или менее, что предлагается в сообщении, связанном с Вашим вопросом. Извините за волнение.

1
ответ дан Laurent Farcy 24 November 2019 в 14:53
поделиться

Любите Tiago Pinto, сказал, и просто не имейте своей модели, наследовались ActiveRecord:: Основа. Это просто будет регулярный класс Ruby, что Вы всовываете файл в своем app/models/каталоге. Если ни одна из Ваших моделей не имеет таблицы, и Вы не используете базу данных или ActiveRecord вообще в Вашем приложении, несомненно, изменят Ваш environment.rb файл для имения следующей строки:

config.frameworks -= [:active_record]

Это должно быть в Rails::Initializer.run do |config| блок.

0
ответ дан Sarah Vessels 24 November 2019 в 14:53
поделиться

Используйте Validatable gem. Как вы говорите, существуют решения на основе AR, но они, как правило, хрупкие.

http://validatable.rubyforge.org/

2
ответ дан 24 November 2019 в 14:53
поделиться

Вам следует проверить плагин PassiveRecord . Он дает вам интерфейс, подобный ActiveRecord, для моделей, не связанных с базами данных. Это просто и меньше хлопот, чем борьба с ActiveRecord.

Мы используем PassiveRecord в сочетании с гемом Validatable , чтобы получить желаемое поведение OP.

0
ответ дан 24 November 2019 в 14:53
поделиться

Я создал быстрый Mixin для обработки этого, согласно предложению Джона Топли.

http://github.com/willrjmarshall/Tableless

3
ответ дан 24 November 2019 в 14:53
поделиться
Другие вопросы по тегам:

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