我個人認爲這比三元運算符更可讀。
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
時被調用爲零,所以它也將返回零,因此變量將被設置爲commentable.created_at
。
你的錯誤是什麼?如果你正在使用ActiveRecords,我不確定我知道'created_at'會是'nil',除非你已經添加了一個新線程並且還沒有保存;或者你沒有'comment_threads',但是'last'會返回'nil' – 2013-05-05 15:47:03