2010-08-26 60 views
1

我想從控制器中提取邏輯,使其更加乾燥。在Rails中處理類似以下內容的最佳方式是什麼?在Rails中抽象ActiveRecord模型查詢的最佳實踐?

例如,而不是讓在控制器的查詢,我可以把它放在模型:

class SmoothieBlender < ActiveRecord::Base 
    belongs_to :user 

    def self.get_blenders_for_user(user) 
     self.where(["user_id = ?", user.id]) 
    end 
end 

或者它會更好地創建一個模塊作爲一個服務層,包括在每個使用它的模型?

module BlenderUser 
    def get_blenders_for_user(user) 
     SmoothieBlender.where(["user_id = ?", user.id]) 
    end 
end 

class SmoothieBlender < ActiveRecord::Base 
    include BlenderUser 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    include BlenderUser 
    has_many :smoothie_blenders 
end 

或者只是使其成爲一個完整的服務類,可以從用戶和Blender控制器訪問?你會把這堂課放在哪裏?

class BlenderService 
    def self.get_blenders_for_user(user) 
     SmoothieBlender.where(["user_id = ?", user.id]) 
    end 
end 

我是Ruby和Rails的新手,所以如果這是一個愚蠢的問題/語法不正確,請原諒我。提前致謝!

回答

5

我想創建一個named_scope(我認爲這只是scope對Rails 3)

class SmoothieBlender < ActiveRecord::Base 
    belongs_to :user 

    scope :for_user, lambda { |user_id| 
     where("user_id = ?", user_id) 
    } 
end 

這樣,您就可以撥打

SmoothieBlender.for_user(user.id) 
+0

啊,有道理!有點像.Net中的擴展。謝謝! – MunkiPhD 2010-08-26 19:41:07

+1

如果參數是以params形式傳入的,請記住在其上使用.to_i。例如,在哪裏(「user_id =?」,user_id.to_i) – 2010-08-26 23:00:44

+0

to_i會嘗試解析它,如果它沒有被消毒,我會失敗嗎? – MunkiPhD 2010-08-29 01:49:26