从 rails 2.3 迁移到 rails 3.1 时出现活动记录错误
Active record error when migrating from rails 2.3 to rails 3.1
我正在从 rails 2.3 应用程序迁移到 Rails 3.1,当我尝试保存记录时出现此错误。这不是早些时候发生的,我不确定可能是什么原因,任何帮助将不胜感激,谢谢。
这是我的模型预览
**
class Store < ActiveRecord::Base
has_many :orders
end
**
**
class Order < ActiveRecord::Base
has_many :items, :dependent => :delete_all
end
**
**
class Item < ActiveRecord::Base
belongs_to :order
validates_presence_of :order_id
end
**
以下是我尝试保存时的错误消息日志
**
ActiveRecord::RecordInvalid: Validation failed: Items order can't be blank
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/validations.rb:56:in `save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:246:in `block in save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/connection_adapters/abstract/database_statements.rb:194:in `transaction'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:208:in `transaction'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:246:in `save!'
from (irb):16
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands/console.rb:45:in `start'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands/console.rb:8:in `start'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
1
**
当我尝试通过控制台保存订单时。主键被保存为 nil。
o = st.orders.new(:store_order_id => "1M",:date_time => Time.now)
这是我
时看到的
o.save
#<Order id: nil, store_order_id: "12121M", date_time: nil>
下面是我的订单控制器创建代码的预览
def create
@order = @store.orders.new(params[:order])
@order.save
end
你的问题是你不能这样做:
validates_presence_of :order_id
在项目模型中。原因很简单:Order id 是验证后创建的,因此不存在。
有几件事要做:
- 添加反向关系
- 将您的验证更改为仅检查是否存在 "order",而不是 "order_id"
代码如下:
class Order < ActiveRecord::Base
has_many :items, :inverse_of => :order, :dependent => :delete_all
end
class Item < ActiveRecord::Base
belongs_to :order, :inverse_of => :items
validates_presence_of :order
end
我正在从 rails 2.3 应用程序迁移到 Rails 3.1,当我尝试保存记录时出现此错误。这不是早些时候发生的,我不确定可能是什么原因,任何帮助将不胜感激,谢谢。
这是我的模型预览
**
class Store < ActiveRecord::Base
has_many :orders
end
**
**
class Order < ActiveRecord::Base
has_many :items, :dependent => :delete_all
end
**
**
class Item < ActiveRecord::Base
belongs_to :order
validates_presence_of :order_id
end
**
以下是我尝试保存时的错误消息日志
**
ActiveRecord::RecordInvalid: Validation failed: Items order can't be blank
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/validations.rb:56:in `save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:246:in `block in save!'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/connection_adapters/abstract/database_statements.rb:194:in `transaction'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:208:in `transaction'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/activerecord-3.1.12/lib/active_record/transactions.rb:246:in `save!'
from (irb):16
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands/console.rb:45:in `start'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands/console.rb:8:in `start'
from /Users/branch/.rvm/gems/ruby-1.9.3-p484/gems/railties-3.1.12/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
1
**
当我尝试通过控制台保存订单时。主键被保存为 nil。
o = st.orders.new(:store_order_id => "1M",:date_time => Time.now)
这是我
时看到的o.save
#<Order id: nil, store_order_id: "12121M", date_time: nil>
下面是我的订单控制器创建代码的预览
def create
@order = @store.orders.new(params[:order])
@order.save
end
你的问题是你不能这样做:
validates_presence_of :order_id
在项目模型中。原因很简单:Order id 是验证后创建的,因此不存在。
有几件事要做:
- 添加反向关系
- 将您的验证更改为仅检查是否存在 "order",而不是 "order_id"
代码如下:
class Order < ActiveRecord::Base
has_many :items, :inverse_of => :order, :dependent => :delete_all
end
class Item < ActiveRecord::Base
belongs_to :order, :inverse_of => :items
validates_presence_of :order
end