我有一个班级人员的列被禁用(如果该人被禁用) 如果此人是残疾人,我们标记为 true 如果那个残疾人有轮椅,我们就把残疾人设为假
但是当我尝试获取带有开关的人员列表时,应返回所有残疾人以及配备轮椅的人员
出示代码
class Person
def disabled
self.where(disable: true).any?
end
def personA?
Person.find_by_id(1).present?
end
def display
if switch?
disabled && personA?
else
disabled
end
end
end
我们能否将逻辑更改为 DRY 或更改设计,寻找解决方案而不添加额外的列(如果可能的话),学习知识帮助我找到了编写这些设计逻辑的方法
如果信息具有单个布尔标志,则无法表示两部分:
另外,我建议不要使用“残疾人”一词来表示“需要轮椅”。残疾有许多不同的形式;像
wheelchair_user
这样的东西对于代码和现实世界都更具描述性。
因此我将代码写成这样:
class Person
def needs_wheelchair?
wheelchair_user && !has_wheelchair
end
end
作为替代方案,您可以考虑将这种轮椅状态 表示为
enum
。像这样的东西:
class Person
enum wheelchair_status: [:not_required, :needed, :owned], _prefix: :wheelchair
end
上面的实现会自动定义一个
Person#wheelchair_needed?
方法,以及像 Person.wheelchair_not_required
这样的范围。
但是,潜在的缺点是您会失去数据粒度:无法识别“不需要轮椅但仍拥有轮椅”的人。 (除非您为此边缘情况添加了第四个 enum
值?!)