1

我想将控制器中的逻辑提取到可以更干燥的地方。在 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

或者只是让它成为一个完整的服务类,可以从用户和 Blender 控制器访问?你会把这门课放在哪里?

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

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

4

1 回答 1

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)
于 2010-08-26T19:02:36.743 回答