gpt4 book ai didi

ruby-on-rails - validates_presence_of 与belongs_to 关联,正确的方法

转载 作者:行者123 更新时间:2023-12-03 22:40:13 25 4
gpt4 key购买 nike

我正在研究 validates_presence_of 的实际工作原理。假设我有两个模型

class Project < ActiveRecord::Base
[...]
has_many :roles
end


class Role < ActiveRecord::Base
validates_presence_of :name, :project

belongs_to :project
end

我希望这个角色始终属于现有项目,但我刚刚从 this example 中发现这可能会导致保存到数据库中的无效(孤立)角色。所以正确的做法是插入 validates_presence_of :project_id在我的角色模型中,它似乎有效,即使我认为语义上更有意义来验证项目的存在而不是项目 ID。

除此之外,我认为如果我只是验证 project_id 的存在,我可以放置一个无效的 id(对于一个不存在的项目),因为默认情况下 AR 不会向迁移添加完整性检查,即使我手动添加它们一些数据库不支持它们(即带有 MyISAM 或 sqlite 的 MySQL)。这个例子证明
# with validates_presence_of :name, :project, :project_id in the role class
Role.create!(:name => 'foo', :project_id => 1334, :project => Project.new)
AREL (0.4ms) INSERT INTO "roles" ("name", "project_id") VALUES ('foo', NULL)
+----+------+------------+
| id | name | project_id |
+----+------+------------+
| 7 | foo | |
+----+------+------------+

当然我不会写这样的代码,但是我想防止DB中出现这种错误数据。

我想知道如何确保角色始终具有关联的(真实的和保存的)项目。

我找到了 validates_existence gem,但除非绝对必要,否则我宁愿不将 gem 添加到我的项目中。

对此有什么想法吗?

更新
validates_presence_of :project并添加 :null => false对于迁移中的 project_id 列似乎是一个更清晰的解决方案。

最佳答案

如果没有找到带有 id 的对象,Rails 将尝试查找 id 并添加验证错误。

class Role < AR::Base
belongs_to :project
validates_presence_of :project, :name
end


Role.create!(:name => "admin", :project_id => 1334)# Project 1334 does not exist
# => validation error raised

我看到你的问题也想处理提供了作者对象但它是新的而不是在数据库中的情况。如果存在检查不起作用。会解决。
Role.create!(:name => "admin", :project => Project.new) # Validation passes when it shouldn't.

更新:
在某种程度上,您可以通过对关联的 :project 进行验证来减轻传递虚拟新对象的影响。
class Role < ActiveRecord::Base
belongs_to :project
validates_presence_of :project
validates_associated :project
end

Project.new.valid?则为假 Role.create!(:name => "admin", :project => Project.new)也会引发错误。但是,如果 Project.new.valid?为真则上述内容将在保存时创建一个项目对象。

是否使用 validates_associated :project帮你?

关于ruby-on-rails - validates_presence_of 与belongs_to 关联,正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6155396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com