Наилучшая практика для абстрагирования запросов модели ActiveRecord в Rails? - PullRequest
1 голос
/ 26 августа 2010

Я бы хотел извлечь логику из контроллеров куда-нибудь, чтобы она была более СУХОЙ. Как лучше всего обрабатывать что-то вроде следующего в 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, поэтому, если это глупый вопрос / синтаксис неверен, прости меня. Заранее спасибо!

1 Ответ

5 голосов
/ 26 августа 2010

Я бы создал 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)
...