Rails 3.2.16 has_many集合构建失败

时间:2018-01-01 23:05:32

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

在Rails 3.2.16中有遗留应用程序,它评估升级并在运行与两个模型之间的ActiveRecord关联相关的测试时发现问题。问题是,当试图构建关联集合时,它失败了。

我测试了相同的方案是使用Ruby on Rails Getting Started Guide的简单测试应用程序(详情如下)。我的测试应用和遗留应用之间的一个区别是遗留应用模型对它们进行了大量验证。

模型如下(为便于阅读而删除了额外的细节):

class Schedule < ActiveRecord::Base
    has_many :bookings
    ...
end

class Booking < ActiveRecord::Base
   belongs_to :schedule
   validate :ensure_sufficient_capacity
   ...

   # validation custom method
   def ensure_sufficient_capacity
       errors.add(:base, "Not enough capacity") unless capacity_available_for_booking?
   end
end

操作的 bookings_controller 具有以下顺序:

class BookingController < ApplicationController

  def new
      #find the named schedule
      @schedule = Schedule.find_by_name("myschedule")

      #build the booking
      @booking = @schedule.bookings.build(:name => "mybooking",...)

      @booking.save #fails to save
  end

end

一些观察结果:

  1. 预订模型对其进行了验证,检查了引用的时间表(关系的另一方。验证失败会导致中断协会建设?

  2. 根据Rails指南创建测试应用程序Post-Comments入门示例使用下面输出的示例显示has_many构建操作有效。

  3. 本地&GT; p = Post.new(:title =&gt;&#34; foo&#34;)

    本地&GT; #

    本地&GT; p.save

    本地&GT;插入&#34;帖子&#34; (&#34;标题&#34;)价值($ 1)返还&#34; id&#34; [[&#34; title&#34;,&#34; foo&#34;]]

    本地&GT; c = p.comments.build(:commenter =&gt;&#34; bar&#34;)

    本地&GT; #

    本地&GT; c.save

    本地&GT; INSERT INTO&#34;评论&#34; .......

1 个答案:

答案 0 :(得分:0)

好的 - 解决了这个问题。它似乎无法根据我拥有的代码库或序列进行验证。

调查结果如下

  • 测试代码验证了 has_many 关系,关联对象的集合 .build正常工作,而保存则添加相关对象的ID。
  • has_many 上的对象添加验证失败将在保存时停止数据库事务,从而导致回滚。这不是问题,因为验证工作正常并且没有返回 false
  • 测试生产服务器(Heroku)上的代码工作正常,但是我的Git副本错了,所以检查Heroku代码,通过heroke git:clone -a appname我设置并对我的本地数据库和整件事情都有效。

总而言之 - 我没有看到我有不同版本的代码库,这是我的错。我曾假设在GitHub上提供给我的遗留应用程序是生产版本。不幸的是,由于基于一些时间的快速修复,以前的所有者已经克隆,迁移并部署到Heroku而没有在Github上更新或将Heroku部署连接到Github。这导致与事实来源脱节,没有文件指出我正确的方向,需要大量的逆向工程。

无论如何都是对课程的一个很好的强化 - 当它并非全部加起来时,通常是导致问题的最简单的错误! 甚至它没有通过嗅觉测试。

感谢Ruby RacerPacunaFabrizio Bertoglio的评论中的所有建议,我希望将来能够回复。我知道我学到了更多技巧,特别是关于检查错误。