7

我有以下 ActiveRecord 调用:

@payment = account.business.payments.find(params[:id])

它通过关联搜索paymentid 为 的params[:id]。但是,这会引发 RecordNotFound 异常。

我想打电话exists?来查看记录是否存在以避免引发异常。做Payment.exists?(account.business.payments.find(params[:id]))是不行的。

我只想搜索payments那个belong_tobusiness而不是所有的付款Payment.exists?(:id => params[:id])。这样我就可以知道这是该特定帐户的业务付款。

我怎样才能做到这一点?

注意: accounthas_onebusinessbusinesshas_many payments

4

4 回答 4

12

使用where而不是find,它将返回一个ActiveRecord::Relation代表 0 条或更多条记录,您可以将其链接起来.exists?

@payments = account.business.payments.where(id: params[:id])


if @payments.exists?
  # ...
end
于 2013-06-20T18:39:09.433 回答
3

如果只需要检查是否存在:

account.business.payments.where(:id => params[:id]).exists?

如果您打算使用此记录,请致电.first而不是 exists?因为预计只有 1 条记录。顺便说一句,您也可以使用动态查找器(在 Rails 4 中已弃用)来执行此操作:

account.business.payments.find_by_id(params[:id])

如果不存在记录,这将返回nil(而不是炸毁)。

于 2013-06-20T18:39:02.930 回答
0

您必须记住,使用present?强制 ActiveRecord 从数据库加载整个集合,这显然并不总是理想的:

user.posts.present?
=>  SELECT `posts`.* FROM `posts` WHERE `posts`.`user_id` = 1 ORDER BY `sales`.`id` ASC

如果要检查数据库中是否存在集合并且不需要数据,请使用any?

user.posts.any?
=> SELECT 1 AS one FROM `posts` WHERE `posts`.`user_id` = 1 LIMIT 1

同样exists?没有任何参数的工作方式与any?

user.posts.exists?
=> SELECT 1 AS one FROM `posts` WHERE `posts`.`user_id` = 1

但是你可以用这个做更多:https ://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-exists-3F

于 2018-10-25T19:39:28.107 回答
0

如果我错了,有人可以否决,但我建议

account.business.payments.where(:id => params[:id]).pluck(:id).present?

通过采摘,您将跳过关联对象的实例化。这意味着它们不必加载到内存中,如果您经常这样做,这将节省一些周期

于 2017-10-30T21:00:18.933 回答