【问题标题】:Active record error when migrating from rails 2.3 to rails 3.1从 rails 2.3 迁移到 rails 3.1 时出现活动记录错误
【发布时间】:2015-07-07 12:41:26
【问题描述】:

我正在从 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 =&gt; "1M",:date_time =&gt; 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

【问题讨论】:

  • 错误自己说话。您在验证时遇到模型错误,阻止订单出现,并且由于某种原因您没有这样做。
  • 提供一些模型预览。特别是在您验证列的地方
  • 你好 Hernan Velasquez,没错,但在迁移到 rails 3.1 之前没有发生这种情况,它在 rails 2.3 中工作,因此我不确定出了什么问题
  • 那么您应该发布您的型号代码
  • 我已经添加了我的型号代码

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

你的问题是你不能这样做:

validates_presence_of :order_id

在项目模型中。原因很简单:Order id 是在验证后创建的,因此不存在。

有几件事要做:

  1. 添加反向关系
  2. 将您的验证更改为仅检查是否存在“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

【讨论】:

  • 顺便说一句,我不知道您为什么要迁移到 3.1,除非您正在逐步升级。完成前请转到最新的 4.2。
  • 是的,我正在逐步升级,但你能告诉我为什么相同的代码在 rails 2.3 中有效,而不是在 rails 3.1 中有效吗?
  • 老实说,我不知道也不关心为什么它可以在 2.3 中工作,但考虑到您的代码,它应该会出错。我给你的是正确的,这才是最重要的。
  • 另外,你可能是新来的,所以我会提到这一点。在确认我的答案是正确的之后,你应该支持我的答案。谢谢。
  • 这解决了这个问题,但它在 Rails 2.3 中工作而不是在 Rails 3.1 中工作很神秘
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多