1

コントローラーからロジックを抽出して、より DRY にできるようにしたいと考えています。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は初めてなので、これがばかげた質問/構文が間違っている場合はご容赦ください。前もって感謝します!

4

1 に答える 1

5

を作成します( Rails 3named_scopeだけだと思います)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)
于 2010-08-26T19:02:36.743 に答える