2012-12-27 65 views
0

我在我的應用程序中使用兩種不同類型的用戶的設計。他們被稱爲用戶和專業人士。什麼是最類似的方式來構建以下

我現在有一個名爲MessagesController一個簡單的資源爲基礎的控制器這對於目前的職業這樣

class MessagesController < ApplicationController 
    def index 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
end 

我想找到保持這種控制器,但更改查詢基於類型的最佳方式翻出消息的已登錄用戶。我希望同樣的情況發生在資源的所有行動(指數,新,創建,更新等)

我知道我能做到這一點

if current_user 
    @messages = Message.find_all_by_user_id(current_user.id) 
else 
    @messages = Message.find_all_by_profession_id(current_professional.id) 
end 

但是這在所有操作中都會很笨重和混亂。我相信肯定有更好的方法。像這樣做的最有效途徑是什麼?我是否應該創建一個全新的控制器來處理基於用戶的消息?

回答

1

我能想到的方法有兩種:

你可以把你的代碼initialize方法控制器內:

def initialize 
    if current_user 
     @messages = Message.find_all_by_user_id(current_user.id) 
    else 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
    super 
end 

或者你可以創建一個before_filter

class MessagesController < ApplicationController 
    before_filter :get_messages 
    private 
    def get_messages 
    if current_user 
     @messages = Message.find_all_by_user_id(current_user.id) 
    else 
     @messages = Message.find_all_by_profession_id(current_professional.id) 
    end 
    end 
end 
1

恕我直言,我認爲你可以將這塊代碼移動到模型中,所以控制器只會傳遞用戶參數並從模型中獲取所有消息。

# messsages_controller.rb 
@messages = Message.find_all_messages(current_user, current_professional) 

# message.rb 
def self.find_all_messages(user, professional) 
    if user 
    self.find_all_by_user_id(user.id) 
    else 
    self.find_all_by_profession_id(professional.id) 
    end 
end 

我認爲這種代碼更適合您的模型。當然你可以改進if/else代碼,但是我現在沒有想法。

相關問題