我在帮助程序中使用此代码根据状态显示计数 -
def to_do_count
Task.where(status: 0).count
end
def in_progress_count
Task.where(status: 1).count
end
def paused_count
Task.where(status: 2).count
end
def completed_count
Task.where(status: 3).count
end
我需要帮助来优化此代码,因为有很多重复。
答案 0 :(得分:1)
[self dismissViewControllerAnimated:NO completion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ShareArray" object:_selectedimgarray];
[[NSNotificationCenter defaultCenter] postNotificationName:@"SharetitleArray" object:_newtile];
[[NSNotificationCenter defaultCenter] postNotificationName:@"sharevideooutputurl" object:_finalvideourl];
[self.tabBarController setSelectedIndex:0];
});
}];
现在打电话:
def count_of(type)
Task.where(status: get_status_type(type)).count
end
def get_status_type(type)
{to_do: 0, in_progress: 1, paused_count: 2, completed_count: 3}[type]
end
而不是
count_of(:to_do)
答案 1 :(得分:1)
选项1
def task_count(status)
Task
.where(status: { to_do: 0, in_progress: 1, paused_count: 2, completed_count: 3 }[status])
.count
end
task_count(:to_do)
task_count(:in_progress)
选项2
您可以使用范围
来简化它class Task
scope :to_do, -> { where(status: 0) }
scope :in_progress, -> { where(status: 1) }
scope :paused_count, -> { where(status: 2) }
scope :completed_count, -> { where(status: 3) }
end
然后帮助器看起来像这样:
def task_count(status)
Task.send(status).count
end
task_count(:to_do)
答案 2 :(得分:1)
使用哈希常量
TASK = {
to_do: 0,
in_progress: 1,
paused_count: 2,
completed_count: 3
}
def self.count_of(type)
Task.where(status: TASK[type]).count
end
在课堂上调用
Task.count_of(:to_do)
答案 3 :(得分:1)
您可以定义STATUSES
常量,然后使用Ruby中的运行时方法定义来定义这些方法。代码就像
STATUSES = {
to_do: 0,
in_progress: 1,
paused: 2,
completed: 3
}
def count_for(status)
Task.where(status: status).count
end
STATUSES.each do |k, v|
define_method("#{k}_count"){ count_for(v) }
end
现在你可以调用所有这些方法。因为它们是动态定义的