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

Mun*_*PhD 1 ruby activerecord abstraction ruby-on-rails controllers

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

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

class SmoothieBlender < ActiveRecord::Base
   belongs_to :user

   def self.get_blenders_for_user(user)
      self.where(["user_id = ?", user.id])
   end
end
Run Code Online (Sandbox Code Playgroud)

或者将模块创建为服务层并将其包含在使用它的每个模型中会更好吗?

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ju *_*ira 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
Run Code Online (Sandbox Code Playgroud)

这样你就可以打电话了

SmoothieBlender.for_user(user.id)
Run Code Online (Sandbox Code Playgroud)