如何使用ActiveRecord Ruby中同一行的id创建一个字段

时间:2012-03-31 13:27:21

标签: ruby activerecord

- - - - - - - - UPDATE

好吧,问题出现在last.id。创建数据库时工作正常,但未失败时。现在的问题是不同的:如何使用同一行的id创建一个字段?

-------- ORIGINAL ------

我正在使用纯红宝石(没有Rails)的活动记录,我真的对此感到疯狂。 这是我的代码

class Enviroment < ActiveRecord::Base
    #self.table_name = 'enviroments'
    self.connection.create_table(:enviroments, :force=>true) do |t|
        t.column :name, :string, :default=>'env-'+ (last.id-1).to_s
        t.column :ssh, :string, :default=>nil
    end
end

这里是错误:

ActiveRecord::StatementInvalid: Could not find table 'enviroments'
from /usr/lib/ruby/gems/1.8/gems/activerecord-3.2.3/lib/active_record/connection_adapters/sqlite_adapter.rb:465:in `table_structure'

如果我使用self.table_name = 'enviroments'仍无法正常工作。我更新了宝石,但都没有。 我是ruby和数据库的新手,但我无法理解这个问题,我认为这个代码在过去有效:S

2 个答案:

答案 0 :(得分:0)

创建表的代码(顺便说一下,在模型中很奇怪)正在调用last.id,当然要调用last表必须已经存在。

因为您将:force => true传递给create_table,如果表格已经存在,您实际上会销毁该表格。

如果在调用last.id之前在局部变量中隐藏了create_table的值,你可能会使你的代码工作,但我不明白你为什么要这样创建表。

答案 1 :(得分:0)

最后,这是我的解决方案:

class Enviroment < ActiveRecord::Base
after_create :create_default

private
def create_default
    if name == nil
        s = 'env-' + self.id.to_s
        self.name = s
        self.save
    end
end

end

class CreateSchema < ActiveRecord::Migration
create_table(:enviroments, :force=>true) do |t|
    t.column :name, :string, :default=>nil
    t.column :ssh, :string, :default=>nil
end