Best Practice per astratte ActiveRecord query modello in Rails?
-
01-10-2019 - |
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!
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)