鉴于“Rails的路”似乎是不使用外键约束,我正在寻找一个替代,让我来验证一个外键引用是否确实行TableA中存在之前,我保存TableB中的对象与table_a_id。
我发现这样做迄今为止唯一的资源(无法找到一个链接到它提到的博客文章,日期是2007年)似乎并没有被使用Rails 3.2兼容的,所以任何人都可以提出的一种方式这样做呢?
目前我期待创造一个验证器手动分配给相应的属性在我的模型,但我不能工作,如何与validate_each(对象,属性值)做到这一点。
鉴于“Rails的路”似乎是不使用外键约束,我正在寻找一个替代,让我来验证一个外键引用是否确实行TableA中存在之前,我保存TableB中的对象与table_a_id。
我发现这样做迄今为止唯一的资源(无法找到一个链接到它提到的博客文章,日期是2007年)似乎并没有被使用Rails 3.2兼容的,所以任何人都可以提出的一种方式这样做呢?
目前我期待创造一个验证器手动分配给相应的属性在我的模型,但我不能工作,如何与validate_each(对象,属性值)做到这一点。
有一个插件,可以帮助您与此为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
简单地使用如下,
validates :user, presence: true
它会自动检查用户记录的存在,在分贝。
我有这段代码的问题:
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?
需要注意的是像Rails 3.2的validates_presence_of工作正是你希望它在这种情况下的方式,你没有建立一个复杂的结构,像上面的答案,甚至用好的validates_existence_of宝石。
我不喜欢例外。 我做这个解决了这个问题:
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
你需要指定inverse_of
选项,然后确认它的存在是真实的。
从活动记录验证指南 :
为了验证相关的记录,其存在是必需的,你必须指定:为协会inverse_of选项