只有当该值有效时,如何将变量设置为值?

时间:2016-05-03 03:36:39

标签: ruby-on-rails ruby

我想将变量设置为给定值,但前提是该值有效。

现在这是我的代码:

if Something.find(params[:id].comments.first.exists?
  @comment = Something.find(params[:id]).comments.first
else
  @comment = nil
end

但这是低效的,因为它必须加载两次记录。

我尝试使用ruby方法try来确保只有在值有效时才设置变量:

@comment = Something.try.find(params[:id]).comments.first

但无论我把它放在哪里,我都会回来“nil is not symbol”错误。似乎try仅用于打印变量。

任何人都知道我只用一个查询就可以完成这个任务吗?

4 个答案:

答案 0 :(得分:1)

你可以尝试:

@comment = Comment.find_by(something_id: params[:id])

答案 1 :(得分:0)

你有没有尝试过?

if @comment = Something.find(params[:id]).comments.first
    # do something with your @comment variable
else
    # do something else
end

更多示例:Check if record exists from controller in Rails

答案 2 :(得分:0)

# Attempt your query

@comment = Something.find(params[:id]).comments.first

# If the record does not exist, use rescue to handle the exception gracefully

rescue ActiveRecord::RecordNotFound
  # Handle the exception
  @comment = nil
end

您可以找到有关例外和异常处理的更多信息here

答案 3 :(得分:0)

我认为这就是你想要的:

@comment = Something.find_by(id: params[:id]).try(:comments).try(:first)

在这种情况下,find_by将返回Something对象或nil。在nil的情况下,尝试链仍将返回nil,并且,如果是object,则会执行尝试中的方法并为您提供第一个注释(如果存在)(注意!如果对象存在,您可能仍然会得到一个nil,因为该对象可能没有任何评论。)

因此,只有当Something对象存在并且有注释时,才会设置@comment;否则,它将是零。