2013-05-05 36 views
0

我想設置成@community_topic.comment_threads.last.created_atlast_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 
+1

你的錯誤是什麼?如果你正在使用ActiveRecords,我不確定我知道'created_at'會是'nil',除非你已經添加了一個新線程並且還沒有保存;或者你沒有'comment_threads',但是'last'會返回'nil' – 2013-05-05 15:47:03

回答

1
last_comment_time = @community_topic.comment_threads.last.created_at.nil? ? commentable.created_at : @community_topic.comment_threads.last.created_at 

有趣的是,在堆棧溢出conditional operator標籤,說明條件運算符是如何工作的:

「條件運算符,代表字符?和:是一個三元運算符,它是幾種編程語言中基本條件表達式的語法的一部分,它通常也被稱爲三元運算符或內聯函數,它的用法如下:(條件) ?(value ...)「

:然後代表else

+0

非常感謝!這很好用 – MKK 2013-05-05 15:58:23

+0

沒問題,昨晚重新閱讀了「雄辯的紅寶石」的前幾章,所以它在我心中是新鮮的! – aceofbassgreg 2013-05-05 15:59:26

+0

是的,我會的。謝謝:) – MKK 2013-05-05 16:00:27

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時被調用爲零,所以它也將返回零,因此變量將被設置爲commentable.created_at

+0

這看起來很清楚,看看:)謝謝 – MKK 2013-05-05 16:15:44

+0

我還應該提到,頂部示例中的if語句也會拋出一個異常,因爲它仍然在'last'上調用'created_at',可能爲零。 – 2013-05-05 16:16:51

+0

我喜歡三元經營者,但番茄番茄,對吧?您對OG問題的修改是專門針對的。 – aceofbassgreg 2013-05-05 16:35:09