在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
一些观察结果:
预订模型对其进行了验证,检查了引用的时间表(关系的另一方。验证失败会导致中断协会建设?
根据Rails指南创建测试应用程序Post-Comments入门示例使用下面输出的示例显示has_many构建操作有效。
本地&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; .......
答案 0 :(得分:0)
好的 - 解决了这个问题。它似乎无法根据我拥有的代码库或序列进行验证。
调查结果如下
heroke git:clone -a appname
我设置并对我的本地数据库和整件事情都有效。总而言之 - 我没有看到我有不同版本的代码库,这是我的错。我曾假设在GitHub上提供给我的遗留应用程序是生产版本。不幸的是,由于基于一些时间的快速修复,以前的所有者已经克隆,迁移并部署到Heroku而没有在Github上更新或将Heroku部署连接到Github。这导致与事实来源脱节,没有文件指出我正确的方向,需要大量的逆向工程。
无论如何都是对课程的一个很好的强化 - 当它并非全部加起来时,通常是导致问题的最简单的错误! 甚至它没有通过嗅觉测试。
感谢Ruby Racer,Pacuna,Fabrizio Bertoglio的评论中的所有建议,我希望将来能够回复。我知道我学到了更多技巧,特别是关于检查错误。