- - - - - - - - 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
答案 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