0

我想设置何时不是当它为零@community_topic.comment_threads.last.created_at时 ,我想设置。 last_comment_time@community_topic.comment_threads.last.created_atnil
commentable.created_at

我该怎么写?我试过这个,但我得到了错误回复:(

last_comment_time = @community_topic.comment_threads.last.created_at || commentable.created_at
4

2 回答 2

3

我个人认为这比三元运算符更具可读性。

last_comment_time = 
  if @community_topic.comment_threads.last.created_at.nil?
    commentable.created_at
  else
    community_topic.comment_threads.last.created_at
  end

如果您要牺牲清晰度,那么更多的行不一定是坏事。

至于你的代码:

last_comment_time = @community_topic.comment_threads.last.created_at || commentable.created_at

这是最好的方法。您很可能会因为.last正在返回而收到错误nil(这是在调用它的范围内没有记录时发生的情况)。因此,在这种情况下,您很可能在@community_topic.

Ruby 提供了一个名为的方法,如果在 Nil::NilClass 上try调用该方法,它将调用一个方法并返回(而不是抛出 NoMethodError 异常)。nil

这可以在您的代码行中使用,如下所示:

last_comment_time = @community_topic.comment_threads.last.try(:created_at) || commentable.created_at

所以last将返回 nil,然后尝试调用created_at. 因为created_at在 nil 上使用 调用try,所以它也将返回 nil,因此变量将设置为commentable.created_at

于 2013-05-05T16:11:11.897 回答
1
last_comment_time = @community_topic.comment_threads.last.created_at.nil? ? commentable.created_at : @community_topic.comment_threads.last.created_at

有趣的是,Stack Overflow 上有一个conditional operator标签解释了条件运算符的工作原理:

“由字符 ? 和 : 表示的条件运算符是一种三元运算符,它是几种编程语言中基本条件表达式语法的一部分。它通常也称为三元运算符或内联 if。它用于如下:(条件)?(值...)“

然后 : 将代替else.

于 2013-05-05T15:35:46.097 回答