我想从控制器中提取逻辑,以便它可以更干。在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的新手,所以如果这是一个愚蠢的问题/语法不正确,请原谅我。提前谢谢!
答案 0 :(得分:5)
我创建了一个named_scope
(我认为它只是Rails 3中的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)