关于用红宝石收集和活动记录保护nils的指南

时间:2011-06-16 13:52:31

标签: ruby-on-rails ruby

有了活跃的记录,我相信在致电时会有所不同:

User.find(23)

User.where("...")

如果是第一种情况,这是否足以对未找到的记录进行抨击?

u = User.find(234)

if u
  # assume record found??
end

或者我应该检查是否为零?和/或坚持?

在带有where子句的第二种情况下,我理解我会收回一个集合,如果没有找到则会得到一个空数组:

users = User.where("...")

if users.blank?
  # assuming at least 1 user model in the collection
end

这是正确的还是有更好的方法?

现在有了常规的ruby集合,你必须在分配之前检查nils:

first_item = some_collection[0] unless some_collection.nil? || some_collection.empty?
# or I can use blank?

对于红宝石和活跃记录中的收藏,这基本上是关于防止nils的所有知识吗?

2 个答案:

答案 0 :(得分:2)

    如果ID为23的用户不存在,则
  1. User.find(23)将引发ActiveRecord::RecordNotFound。如果您希望获得nil,则可以使用User.find_by_id(23)

  2. 正确。还有其他方法,例如在关系上调用#empty?#count,但它们基本相同。

  3. 要从现有但可能为空的集合中获取第一个项目,您可以执行以下操作:

    first_item = some_collection.first
    
    如果some_collection为空,

    将返回nil。这与您的示例有些不同,后者将检查nil集合,如果some_collection为nil或为空,则不会更改first_item。但这是一个不太常见的用例。 (另外,是的,当在空集合上调用时,Rails #blank?方法将返回true。)

答案 1 :(得分:0)

您可以捕获未找到的错误并处理它:

begin
  foo = Foo.find(params[:id])   
rescue ActiveRecord::RecordNotFound
  redirect_to somewhere_else_url
end