gpt4 book ai didi

ruby-on-rails - rails : has_many association: best practices to validate access to array

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:29 25 4
gpt4 key购买 nike

我对 ruby​​ 和 ruby​​-on-rails 还很陌生,所以我需要学习最佳实践。

我有标签模型,每个标签可以有很多子标签和很多 super 标签:

  has_many :super_tags, :through => :tag_hier_rels,         :source => :super_tag
has_many :sub_tags, :through => :reverse_tag_hier_rels, :source => :sub_tag

has_many :tag_hier_rels, :foreign_key => "sub_tag_id"
has_many :reverse_tag_hier_rels, :foreign_key => "super_tag_id", :class_name => "TagHierRel"

我需要防止用户创建循环引用。但是使用自动生成的方法 :super_tags:sub_tags 我不能这样做:每个人都可以这样做:

tag.super_tags.push another_tag,我对此无法控制。Rails 验证机制在这里没有用:这种机制阻止用户将无效对象保存到数据库,但我需要阻止他甚至错误地修改对象:如果我有循环引用,我需要获取所有子标签或 super -递归地标记,我会遇到堆栈溢出。

所以我做了以下事情:

将这些关联声明为私有(private)关联:

private :sub_tags=,   :sub_tags
private :super_tags=, :super_tags

添加了带有 _copy 后缀的方法:

def sub_tags_copy
return sub_tags.clone
end

def super_tags_copy
return super_tags.clone
end

并添加了实际修改数组的方法:

  def sub_tags_push(tag)
sub_tags.push tag if !self.all_sub_tags.include? tag and !self.all_super_tags.include? tag
end

def super_tags_push(tag)
super_tags.push tag if !self.all_sub_tags.include? tag and !self.all_super_tags.include? tag
end

# TODO: more methods (at least we need to remove tags)

(方法all_sub_tagsall_super_tags递归生成数组)

它有效,但我不太喜欢这个解决方案:至少,对于用户来说,他应该使用 ..._copy 方法并不明显。

可能是我做错了?

更新:

或者,不允许用户以错误的方式更改对象通常是不好的做法吗?可能我应该允许用户以错误的方式更改对象,但只在保存前验证它?

至少,我已经发现,如果用户做错了什么,很难提供错误消息:目前,模型只是默默地不修改对象,并且不会生成错误消息。我必须实现自己的错误消息引擎,这一事实证明该方法确实很糟糕……我似乎在与框架作斗争而不是使用它。

最佳答案

您总是指用户,而您指的是程序员

如果是这样的话,你应该尝试通过 assert 这种东西

  1. 教育(开发者对开发者)
  2. 验证(通过测试或 Rails 验证)
  3. 约束(通过数据库约束或触发器在数据库级别)

我会尝试自上而下。

关于ruby-on-rails - rails : has_many association: best practices to validate access to array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20723234/

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