Rails 3.2.16 has_many 集合构建失败
Rails 3.2.16 has_many collection build failure
在 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 new 操作具有以下顺序:
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
一些观察:
booking 模型对其进行了验证,它会检查引用的时间表(关系的另一端。可以验证失败导致关联构建中断 ?
根据 Rails 指南创建测试应用程序 Post-评论入门示例使用下面的输出示例显示 has_many 构建操作有效。
local> p = Post.new(:title => "foo")
本地>#
本地> p.save
local> 插入 "posts" ("title") 值 ($1) 返回 "id" [["title", "foo"]]
local> c = p.comments.build(:commenter => "bar")
本地>#
本地> c.save
local> 插入 "comments" ......
好的 - 解决了问题。根据我拥有的代码库或序列,它似乎无法验证。
调查结果如下
- 测试代码通过 has_many 关系验证了关联对象的 collections.build 工作,并且在保存添加相关对象的 ID。
- 向 has_many 上的对象添加验证失败将在保存时停止数据库事务,从而导致回滚。这不是问题,因为验证工作正常并且没有返回 false
- 在生产服务器 (Heroku) 上测试代码工作正常,但是我的 Git 副本是错误的,因此通过
heroke git:clone -a appname
我设置并测试了这个 Heroku 代码的检出针对我的本地数据库,整个过程都有效。
总而言之 - 没有看到我有不同版本的代码库是我的错。我原以为 GitHub 上提供给我的旧应用程序是生产版本。不幸的是,由于一些基于时间的快速修复,之前的所有者在没有更新 Github 或将 Heroku 部署连接到 Github 的情况下克隆、迁移和部署到 Heroku。这导致了与真相来源的脱节,并且没有文档指向正确的方向,需要大量的逆向工程。
总之很好地强化了这一课 - 当它没有全部加起来时,它通常是导致问题的最简单的错误! 或者连嗅探都没通过
感谢 Ruby Racer, Pacuna,Fabrizio Bertoglio 评论中的所有建议,希望以后能有回报。我知道我学到了更多技巧,尤其是关于检查错误的技巧。
在 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 new 操作具有以下顺序:
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
一些观察:
booking 模型对其进行了验证,它会检查引用的时间表(关系的另一端。可以验证失败导致关联构建中断 ?
根据 Rails 指南创建测试应用程序 Post-评论入门示例使用下面的输出示例显示 has_many 构建操作有效。
local> p = Post.new(:title => "foo")
本地>#
本地> p.save
local> 插入 "posts" ("title") 值 ($1) 返回 "id" [["title", "foo"]]
local> c = p.comments.build(:commenter => "bar")
本地>#
本地> c.save
local> 插入 "comments" ......
好的 - 解决了问题。根据我拥有的代码库或序列,它似乎无法验证。
调查结果如下
- 测试代码通过 has_many 关系验证了关联对象的 collections.build 工作,并且在保存添加相关对象的 ID。
- 向 has_many 上的对象添加验证失败将在保存时停止数据库事务,从而导致回滚。这不是问题,因为验证工作正常并且没有返回 false
- 在生产服务器 (Heroku) 上测试代码工作正常,但是我的 Git 副本是错误的,因此通过
heroke git:clone -a appname
我设置并测试了这个 Heroku 代码的检出针对我的本地数据库,整个过程都有效。
总而言之 - 没有看到我有不同版本的代码库是我的错。我原以为 GitHub 上提供给我的旧应用程序是生产版本。不幸的是,由于一些基于时间的快速修复,之前的所有者在没有更新 Github 或将 Heroku 部署连接到 Github 的情况下克隆、迁移和部署到 Heroku。这导致了与真相来源的脱节,并且没有文档指向正确的方向,需要大量的逆向工程。
总之很好地强化了这一课 - 当它没有全部加起来时,它通常是导致问题的最简单的错误! 或者连嗅探都没通过
感谢 Ruby Racer, Pacuna,Fabrizio Bertoglio 评论中的所有建议,希望以后能有回报。我知道我学到了更多技巧,尤其是关于检查错误的技巧。