Как я могу инициализировать эту модель ActiveRecord Tableless? - PullRequest
0 голосов
/ 04 марта 2011

Я использую Ruby on Rails 3, и я хотел бы инициализировать модель ActiveRecord Tableless.

В моей модели у меня есть:

class Account < ActiveRecord::Base

  # The following ActiveRecord Tableless Model statement is from http://codetunes.com/2008/07/20/tableless-models-in-rails/
  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

  attr_reader :id,
              :firstname,
              :lastname,

  def initialize(attributes = {})
    @id = attributes[:id]
    @firstname = attributes[:firstname]
    @lastname = attributes[:lastname]
  end
end

Если в контроллере, например, вфайл application_controller.rb, я делаю:

@new_account = Account.new({:id => "1", :firstname => "Test name", :lastname => "Test lastname"})

вывод отладки \ проверки переменной @new_account равен

"#<Account >"

Почему?Как правильно инициализировать эту бесклассовую модель ActiveRecord и заставить ее работать?

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Согласно этому сообщению в блоге это должно выглядеть так:

class Account < ActiveRecord::Base

  class_inheritable_accessor :columns

  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

  column :id, :integer
  column :firstname, :string
  column :lastname, :string

end

А потом:

@new_account = Account.new({:id => "1", :firstname => "Test name", :lastname => "Test lastname"})

Вы уже пробовали это так?

0 голосов
/ 04 марта 2011

По моему мнению, вам не нужно расширять класс ActiveRecord :: Base.Вы можете написать свой собственный класс модели примерно так:

# models/letter.rb
class Letter
  attr_reader :char

  def self.all
    ('A'..'Z').map { |c| new(c) }
  end

  def self.find(param)
    all.detect { |l| l.to_param == param } || raise(ActiveRecord::RecordNotFound)
  end

  def initialize(char)
    @char = char
  end

  def to_param
    @char.downcase
  end

  def products
    Product.find(:all, :conditions => ["name LIKE ?", @char + '%'], :order => "name")
  end
end

# letters_controller.rb
def index
  @letters = Letter.all
end

def show
  @letter = Letter.find(params[:id])
end

Надеюсь, это поможет вам.Справка: http://railscasts.com/episodes/121-non-active-record-model

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