当@community_topic.comment_threads.last.created_at
不是last_comment_time
时,我想将@community_topic.comment_threads.last.created_at
设置为nil
当它为零时,我想设置commentable.created_at
。
我怎么写?我试过这个,但我有错误回复:(
last_comment_time = @community_topic.comment_threads.last.created_at || commentable.created_at
答案 0 :(得分: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提供了一个名为try
的方法,如果在Nil :: NilClass上调用该方法(而不是抛出NoMethodError异常),它将调用一个方法并返回nil
。
这可以在你的代码行中使用:
last_comment_time = @community_topic.comment_threads.last.try(:created_at) || commentable.created_at
因此last
将返回nil,然后尝试调用created_at
。由于created_at
使用try
在nil上调用,因此它也会返回nil,因此变量将设置为commentable.created_at
。
答案 1 :(得分: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
标记,解释了条件运算符的工作原理:
“条件运算符,由字符?和:表示,是三元运算符,是几种编程语言中基本条件表达式语法的一部分。它通常也称为三元运算符或内联运算符。它的用法如下:(条件)?(值......)“
:然后代表else
。