2014-04-03 71 views
0

我不太喜歡它的外觀方法all特別是那個部分 .group_by{|x| x.week_number}.values因爲這部分可以被替換嗎? week_number是UserUpdate模型中的實例方法。在group_by中使用實例方法

user_updates_controller.rb

def all 
    @weekly_updates = current_user.user_updates.group_by{|x| x.week_number}.values 
end 

user_update.rb

def week_number 
    (((created_at.utc) - user.first_program_started_at.utc.beginning_of_day)/86400/7).ceil.to_i || 1 
end 
+0

對不起,我不太明白你在問什麼。你能澄清一下你對現在的代碼有什麼擔心嗎?你想達到的目標是什麼? –

+0

@PaulRichter代碼的作品,但我認爲這段代碼是不正確的,並希望重構。 – user3458697

+0

@PaulRichter例如:group_by(:week_number)。但是我有一個錯誤,數據庫中沒有字段'week_number'。那麼我怎樣才能從模型中調用實例方法'week_nubmer'? – user3458697

回答

0

好吧,我相信我現在好理解,但讓我知道,如果這仍然不是你所需的東西。

我相信,在你的情況,你可以簡單地這樣做:

@weekly_updates = current_user.user_updates.group_by(&:week_number).values 

&:week_number符號是創建一個進程的簡寫,將有效調用傳入的對象上week_number方法(在這種情況下,一個UserUpdate對象)。最終,你應該看到完全相同的結果。不會有任何性能差異,所以它主要只是讓你的代碼更漂亮。

檢查出this question以及對該&:表示法的大量示例和解釋的解答。

+0

好吧,如何使用sql'group by',而不是數組?如果可能? – user3458697

+0

@ user3458697不幸的是,你將無法在SQL中使用'week_number'方法。你要麼必須在SQL中重寫你的方法,要麼*可能*使用類似[arel](https://github.com/rails/arel)或[squeel](https://github.com)的庫/ activerecord-hackery/squeel)(不確定,因爲我從來沒有使用過這些)。另外,大多數RDBMS都有日期函數,例如MySql中的'week()',所以在sql中重寫可能與使用正確的日期函數一樣簡單。但是,'group'和'group_by'會給出不同的結果。 –