在Rails中抽象ActiveRecord模型查询的最佳实践?

时间:2010-08-26 18:53:38

标签: ruby-on-rails ruby activerecord abstraction controllers

我想从控制器中提取逻辑,以便它可以更干。在Rails中处理类似以下内容的最佳方法是什么?

例如,与在控制器中进行查询相反,我可以将其放在模型中:

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

或者只是将它变成一个可以从User和Blender控制器访问的完整服务类?你会把这堂课放在哪里?

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

我是Ruby和Rails的新手,所以如果这是一个愚蠢的问题/语法不正确,请原谅我。提前谢谢!

1 个答案:

答案 0 :(得分:5)

我创建了一个named_scope(我认为它只是Rails 3中的scope

class SmoothieBlender < ActiveRecord::Base
   belongs_to :user

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

这样你就可以打电话了

SmoothieBlender.for_user(user.id)