Domanda

Mi piacerebbe estrarre fuori logica dal controller a qualche parte che può essere più SECCO. Qual è il modo migliore di gestire qualcosa di simile a quanto segue in Rails?

Per esempio, invece di avere la query nei controllori, ho potuto metterlo nel modello:

class SmoothieBlender < ActiveRecord::Base
   belongs_to :user

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

O sarebbe meglio creare un modulo come uno strato di servizi e comprendono che in ogni modello che l'usa?

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

o semplicemente fare una classe di servizio in piena regola che è accessibile da parte dell'utente e di controllo Blender? Dove mettereste questa classe?

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

Sono nuovo di Ruby e Rails, quindi se questo è uno stupido domanda / sintassi non è corretta, mi perdoni. Grazie in anticipo!

È stato utile?

Soluzione

mi piacerebbe creare una named_scope (credo che sia solo scope in Rails 3)

class SmoothieBlender < ActiveRecord::Base
   belongs_to :user

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

In questo modo è possibile chiamare

SmoothieBlender.for_user(user.id)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top