Rails的 - 我怎么验证由外键所引用的行存在(Rails - how do I validate

2019-07-29 23:12发布

鉴于“Rails的路”似乎是不使用外键约束,我正在寻找一个替代,让我来验证一个外键引用是否确实行TableA中存在之前,我保存TableB中的对象与table_a_id。

我发现这样做迄今为止唯一的资源(无法找到一个链接到它提到的博客文章,日期是2007年)似乎并没有被使用Rails 3.2兼容的,所以任何人都可以提出的一种方式这样做呢?

目前我期待创造一个验证器手动分配给相应的属性在我的模型,但我不能工作,如何与validate_each(对象,属性值)做到这一点。

Answer 1:

有一个插件,可以帮助您与此为belongs_to的关联: 验证的存在 。 但是,也许你可以添加自己的验证? 什么是这样的:

# Assuming your foreign key is user_id (which references the table User)
validate :user_id_exists

def user_id_exists
  return false if User.find_by_id(self.user_id).nil?
end


Answer 2:

简单地使用如下,

validates :user, presence: true

它会自动检查用户记录的存在,在分贝。



Answer 3:

我有这段代码的问题:

return false if User.find(self.user_id).nil?

我只好赶ActiveRecord的异常,当没有发现匹配的记录。 当没有找到记录不工作; 异常被之前抛出 被执行。

# Assuming your foreign key is user_id (which references the table User)
validate :user_id_exists

def user_id_exists
  begin
    User.find(self.user_id)
  rescue ActiveRecord::RecordNotFound
    errors.add(:user_id, "user_id foreign key must exist")
    false
  end
end

当你使用这是有用的 断言在单元测试。

request.user_id = unknown
assert request.invalid?

request.user_id = 1
assert request.valid?


Answer 4:

需要注意的是像Rails 3.2的validates_presence_of工作正是你希望它在这种情况下的方式,你没有建立一个复杂的结构,像上面的答案,甚至用好的validates_existence_of宝石。



Answer 5:

我不喜欢例外。 我做这个解决了这个问题:

class Foo < ActiveRecord::Base

    validate :bar_exists

    protected

    def bar_exists
        if !User.where(bar_id: self.bar_id).exists? then
            errors.add(:bar_id, 'A valid bar_id is valid.')
        end
    end

end


Answer 6:

你需要指定inverse_of选项,然后确认它的存在是真实的。

从活动记录验证指南 :

为了验证相关的记录,其存在是必需的,你必须指定为协会inverse_of选项



文章来源: Rails - how do I validate existence of a row referenced by foreign key