我正在按照我一直在研究的工作室实现"服务对象",我正在构建一个reddit API应用程序.我需要对象返回一些东西,所以我不能只在初始化器中执行所有操作.我有这两个选项:
选项1:类需要实例化
class SubListFromUser
def user_subscribed_subs(client)
@client = client
@subreddits = sort_subs_by_name(user_subs_from_reddit)
end
private
def sort_subs_by_name(subreddits)
subreddits.sort_by { |sr| sr[:name].downcase }
end
def user_subs_from_reddit
@client.subscribed_subreddits :limit => 100
end
end
Run Code Online (Sandbox Code Playgroud)
叫:
@subreddits = SubListFromUser.new(@client).user_subscribed_subs
Run Code Online (Sandbox Code Playgroud)
或者Option2将它作为一个类方法:
class SubListFromUser
def self.user_subscribed_subs(client)
sort_subs_by_name(client, user_subs_from_reddit)
end
private
def self.sort_subs_by_name(subreddits)
subreddits.sort_by { |sr| sr[:name].downcase }
end
def self.user_subs_from_reddit(client)
client.subscribed_subreddits :limit => 100
end
end
Run Code Online (Sandbox Code Playgroud)
叫:
@subreddits = SubListFromUser.user_subscribed_subs(@client)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,什么被认为是"最佳实践"?有没有理由我不应该使用object.new(args).method?我认为它提供了一个更清洁的服务类,但我不确定这种方法的技术性,如果它有缺点.
编辑:或者选项3 - 我说这一切都错了,有一个更好的方法:)
我有一个模型关注点,它添加了一个方法't',允许模型字段转换为I18n:
module Translatable
extend ActiveSupport::Concern
def t(field_name)
I18n.t("models.#{self.class.table_name}.#{translation_tag}.#{field_name}")
end
Run Code Online (Sandbox Code Playgroud)
模型:
class Model < ActiveRecord::Base
include Translatable
Run Code Online (Sandbox Code Playgroud)
使用以下方法几乎无处不在:
@model.t(:name)
Run Code Online (Sandbox Code Playgroud)
但是我有一个select字段,它使用此代码映射条目:
Model.all.order(name: :asc), :id, :name
Run Code Online (Sandbox Code Playgroud)
我想:名称使用可翻译的方法代替.以下工作,但我得到一个缺少参数错误(很明显为什么):
Model.all.order(name: :asc), :id, :t
Run Code Online (Sandbox Code Playgroud)
但是这不起作用:
Model.all.order(name: :asc), :id, :t(:name)
Run Code Online (Sandbox Code Playgroud)
将变量作为符号调用时,将变量传递给方法的正确方法是什么?