加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 以belongs_to关联验证validates_presence_of,

发布时间:2020-12-16 23:05:20 所属栏目:百科 来源:网络整理
导读:我正在调查validates_presence_of实际上是如何工作的.假设我有两个模型 class Project ActiveRecord::Base [...] has_many :rolesend 和 class Role ActiveRecord::Base validates_presence_of :name,:project belongs_to :projectend 我想要它,以便角色总是
我正在调查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发现这可能导致无效(孤立)角色保存到数据库中.因此,正确的方法是在我的Role模型中插入validates_presence_of:project_id,它似乎有效,即使我认为在语义上更有意义来验证项目的存在而不是项目ID.

除此之外,如果我只是验证project_id的存在,我认为我可以放置一个无效的id(对于一个非现有项目),因为默认情况下AR不会为迁移添加完整性检查,即使我手动添加了一些数据库不支持它们(即MySQL与MyISAM或sqlite).这个例子证明了

# 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宝石,但我更喜欢不在我的项目中添加宝石,除非是绝对必要的.

有什么想法吗?

更新

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

解决方法

如果找不到具有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

我看到你的问题也想处理提供作者对象但是新的而不是db的情况.如果存在检查不起作用.会解决.

Role.create!(:name => "admin",:project => Project.new) # Validation passes when it shouldn't.

更新:
在某种程度上,您可以通过对关联的项目进行验证来减轻传递虚拟新对象的影响.

class Role < ActiveRecord::Base
  belongs_to :project
  validates_presence_of :project
  validates_associated :project
end

如果Project.new.valid?是false,然后Role.create!(:name =>“admin”,:project => Project.new)也会引发错误.但是,Project.new.valid?如果是,则上面将在保存时创建项目对象.

使用validates_associated:project帮助你吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读