2011-03-04 103 views
0

我正在使用Ruby on Rails 3,并希望公开一个ActiveRecord无表模型。如何初始化ActiveRecord无表模型?

在我的模型,我有:

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 Tableless Model并使其工作?

回答

1

根据这一博客帖子它会看起来像这样:

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

它设置除id以外的所有字段(它是'nil') – rubyprince 2011-03-04 12:02:00

+0

你说得对。我想'id'在ActiveRecord中有一个特殊的地位。我认为这只会在记录被保存在某个数据库后才会设置。 – Wukerplank 2011-03-04 12:08:16

+0

@Wukerplank你的代码有效,但'attr_reader'和'attr_writer'呢?如果我尝试设置更多,我会遇到一些麻烦,例如'@ new_account.lastname'。你有什么建议(出于安全原因)? – user502052 2011-03-04 12:15:50

0

我认为,你不需要扩展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

+0

我继承自 user502052 2011-03-04 11:57:52

+0

我认为他需要在列方法中使用ActiveRecord的sql_connections方法..这可能是他为什么要从ActiveRecord扩展的原因。 – rubyprince 2011-03-04 11:58:24

+0

正如@rubyprince所说。 – user502052 2011-03-06 21:35:50