Rails: хранение статических данных, таких как ActiveRecords - PullRequest
2 голосов
/ 28 января 2011

Я давно искал гемы и / или плагины, которые реализуют статическое хранилище, подобное ActiveRecords, но не основаны на базе данных. Давайте назовем этот класс NonDBRecord. Оно должно иметь следующее свойство:

class Foo < NonDBRecord
  add_item('a', :property1 => 'some value', :property2 => 'some more value')
  add_item('b', :property1 => 'some value', :property2 => 'some more value')
end

class Bar < ActiveRecord::Base
  belongs_to_nondbrecord :foo, :class_name => 'Foo'
end

# NonDBRecord declare constants automatically
[ Foo::A, Foo::B ]

# NonDBRecord is enumerable
Foo.all # returns [Foo::A,Foo::B]

# NonDBRecord is id-based
Bar.create(:foo_id => Foo::A.id)

# ...so you can search by it
x = Bar.find(:first, :conditions => { :foo_id => Foo::A.id })

# ...and is stored, retrieved, and instantiated by its id
x.foo # returns Foo::A

Я думал о том, чтобы просто использовать ActiveRecords (и хранилище базы данных), но мне это не нравится. Плюс ко всему, мне приходилось решать некоторые проблемы с загрузкой с помощью решения ActiveRecord. Буду признателен за любую помощь, прежде чем я начну писать свое собственное решение.

редактировать

Эти записи предназначены для перечисления. Например, скажем, вы делаете карточную игру. Я хочу быть в состоянии сделать что-то вроде

class Card < NonDBRecord
  attr_reader :suit, :index
end
class Game
  belongs_to :wild_card, :class_name => 'Card'
end

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Я бы сказал, ActiveModel - это то, что вы ищете. Он поставляется с Rails 3 и инкапсулирует все возможности от ActiveRecord, такие как проверка, сериализация и сортировки По этому вопросу есть Райан Бейтс railscast . Надеюсь, это поможет!

0 голосов
/ 28 января 2011

Как говорит BigD, ActiveModel - это путь Rails 3.

В Rails 2.3 я использую это как ключ:

class TablelessModel < 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

  def save(validate = true) 
     validate ? valid? : true 
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...