Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重构可选参数方法以删除'if'语句_Ruby On Rails_Ruby_Optional Parameters - Fatal编程技术网

Ruby on rails 重构可选参数方法以删除'if'语句

Ruby on rails 重构可选参数方法以删除'if'语句,ruby-on-rails,ruby,optional-parameters,Ruby On Rails,Ruby,Optional Parameters,我有一个方法select\u active\u buildings,其中三个参数默认为nil,可以使用提供的信息过滤我的数据库 def select_active_buildings(category:nil, upgrader:nil, upgrade_resource:nil) my_active_buildings = self.buildings.active(self.townhall_level) if category && upgrader &&a

我有一个方法
select\u active\u buildings
,其中三个参数默认为
nil
,可以使用提供的信息过滤我的数据库

def select_active_buildings(category:nil, upgrader:nil, upgrade_resource:nil)
  my_active_buildings = self.buildings.active(self.townhall_level)
  if category && upgrader && upgrade_resource
    return my_active_buildings.where(category:category, upgrader:upgrader, upgrade_resource:upgrade_resource)
  elsif category && upgrader
    return my_active_buildings.where(category:category, upgrader:upgrader)
  elsif category && upgrade_resource
    return my_active_buildings.where(category:category, upgrade_resource:upgrade_resource)
  elsif upgrader && upgrade_resource
    return my_active_buildings.where(upgrader:upgrader, upgrade_resource:upgrade_resource)
  elsif category
    return my_active_buildings.where(category:category)
  elsif upgrader
    return my_active_buildings.where(upgrader:upgrader)
  elsif upgrade_resource
    return my_active_buildings.where(upgrade_resource:upgrade_resource)
  else
    return my_active_buildings
  end
end
我需要帮助重构此方法。

我会这样做:

def select_active_buildings(category: nil, upgrader: nil, upgrade_resource: nil)
  my_active_buildings = self.buildings.active(self.townhall_level)
  cond = {
    category: category,
    upgrader: upgrader,
    upgrade_resource: upgrade_resource
  }.select { |k, v| v }
  my_active_buildings.where(cond)
end
或者

或者,如果我真的不关心
select\u active\u函数
级别的语法检查

def select_active_buildings(cond)
  my_active_buildings = self.buildings.active(self.townhall_level)
  my_active_buildings.where(cond)
end
如果您确实不想要
.where({})
案例,您可以将
返回我的活动建筑(如果条件为空)

我会这样做:

def select_active_buildings(category: nil, upgrader: nil, upgrade_resource: nil)
  my_active_buildings = self.buildings.active(self.townhall_level)
  cond = {
    category: category,
    upgrader: upgrader,
    upgrade_resource: upgrade_resource
  }.select { |k, v| v }
  my_active_buildings.where(cond)
end
或者

或者,如果我真的不关心
select\u active\u函数
级别的语法检查

def select_active_buildings(cond)
  my_active_buildings = self.buildings.active(self.townhall_level)
  my_active_buildings.where(cond)
end

如果您确实不想使用
.where({})
案例,可以将
返回my_active_buildings If cond.empty?
放在它前面。

假设您正在使用ActiveRecord、Mongoid或其他可链接的
where
案例,您可以利用以下事实:

o.where(:a => b, :c => d)
同:

o.where(:a => b).where(:c => d)
这让您可以这样做:

def select_active_buildings(category: nil, upgrader: nil, upgrade_resource: nil)
  buildings = self.buildings.active(self.townhall_level)
  buildings = buildings.where(category: category) if(category)
  buildings = buildings.where(upgrader: upgrader) if(upgrader)
  buildings = buildings.where(upgrade_resource: upgrade_resource) if(upgrade_resource)
  buildings
end
甚至:

def select_active_buildings(conditions)
  buildings = self.buildings.active(self.townhall_level)
  %i[category upgrader upgrade_resource]
    .select { |f| conditions.has_key?(f) }
    .inject(buildings) { |q, f| q.where(f => conditions[f]) }
end

假设您正在使用ActiveRecord、Mongoid或其他可链接的
where
,您可以利用以下事实:

o.where(:a => b, :c => d)
同:

o.where(:a => b).where(:c => d)
这让您可以这样做:

def select_active_buildings(category: nil, upgrader: nil, upgrade_resource: nil)
  buildings = self.buildings.active(self.townhall_level)
  buildings = buildings.where(category: category) if(category)
  buildings = buildings.where(upgrader: upgrader) if(upgrader)
  buildings = buildings.where(upgrade_resource: upgrade_resource) if(upgrade_resource)
  buildings
end
甚至:

def select_active_buildings(conditions)
  buildings = self.buildings.active(self.townhall_level)
  %i[category upgrader upgrade_resource]
    .select { |f| conditions.has_key?(f) }
    .inject(buildings) { |q, f| q.where(f => conditions[f]) }
end

如果(a)您的代码按预期工作,(b)您的代码是真实代码,而不是示例代码,以及(c)您的代码包含在问题主体中,则此问题更适合此问题。如果您希望通过同行评议来改进代码的各个方面,请将其发布在代码评议上。谢谢,你们都是对的。如前所述-这应该在代码评议上:)是的,我下次会在那里发布,哇!现在有可能改变吗?或者干脆不提这个问题?这个问题会更好,只要(a)您的代码按预期工作,(b)您的代码是真实代码,而不是示例代码,以及(c)您的代码包含在问题主体中,这个问题就可以适用。如果您希望通过同行评议来改进代码的各个方面,请将其发布在代码评议上。谢谢,你们都是对的。如前所述-这应该在代码评议上:)是的,我下次会在那里发布,哇!现在有可能改变吗?或者干脆别管它?最后一个变量是
where(cond.slice(:category,…)
。最后一个变量是
where(cond.slice(:category,…)
。我选择了第一个选项。非常感谢。我同意你的第一个选择。非常感谢。