我的模型中定义了一个非常复杂的方法,我在视图中称之为:
def self.current_rating(recommendation_id, rating_set, product_id)
if !Recommendation.find(recommendation_id).ratings.find_by_rating_set(rating_set).nil?
Recommendation.find(recommendation_id).ratings.find_by_rating_set(rating_set).rating.to_i
elsif !Recommendation.find(recommendation_id).ratings.find_by_product_id(product_id).nil?
Recommendation.find(recommendation_id).ratings.find_by_product_id(product_id).rating.to_i
else
end
end
在我看来,我打电话给:
:selected => Rating.current_rating(rec.id,params[:rating_set_id], params[:product_id])
在我的select_tag
。
基本上我想检查第一个查找是否返回任何内容,如果nil
检查第二个查找,那么nil
是否返回任何内容。我怎样才能重构这个更好/更多的句法?
答案 0 :(得分:0)
def self.current_rating(recommendation_id, rating_set, product_id)
r = Recommendation.find(recommendation_id).ratings
x = r.find_by_rating_set(rating_set) || r.find_by_product_id(product_id)
x && x.rating.to_i
end
所以我注意到你的所有表达都是从找到基于重新识别的推荐标准开始,并获得它的评级。所以我先这样做,分配给r
。
然后我尝试通过rating_set找到,如果失败(它将返回nil),它会短路到按产品ID查找。如果失败(nil),则x将为nil。
无论我们是通过rating_set还是产品ID找到,都要有评级方法。因此,如果x不是nil(x&&),我们调用rating,然后调用to_i。返回,因为它是最后一个表达式。
如果x为零,则返回(nil&& whatever)的结果,这是零。
答案 1 :(得分:0)
你可以做各种事情。在不了解您的应用程序的情况下,我会推荐以下内容:
这一步的每一步都包括Recommendation.find(recommendation_id)
,这使我认为您希望这是Recommendation
模型上的实例方法,因此您不可能运行4个相同的推荐查找。
此方法的第一行从推荐中获得您想要的评分。除非发现某些内容,否则rating
变量仍为nil
。
def current_rating(rating_set, product_id)
ratings.find_by_rating_set(rating_set) || ratings.find_by_product_id(product_id)
end
现在,您将获得一个返回rating
或nil
的方法。由于我们不知道您打算如何处理这个问题,因此很难说接下来应该做些什么,但我觉得这对于这种情况来说是一个更好的整体策略,因为这种方法的意图很明确,至少在某种程度上是这样的在输出中可预测(如果我调用current_rating
方法并收到整数而不是Rating对象,我会有点担心)。如果使用它来在视图中显示评级的数字,这是装饰者或其他模式的一个很好的候选者。