Rails - :所有范围和元编程都不好玩

时间:2012-09-07 15:18:55

标签: ruby-on-rails ruby activerecord refactoring

我怎么能干掉下面的Rails代码? type参数将对应于Rails范围,我假设all也可以工作......但它返回一个数组,我的狡猾计划失败。

if看起来不对,但我无法弄清楚如何让all范围正常工作;任何想法?

不恰当地依赖all作为范围的原始代码:

def readable(type=:all)
  StudyAid.send(type.to_s).authored_by(self)
end

工作但丑陋的版本:

def readable(type=:all)
  if type == :all
    StudyAid.authored_by(self)
  else
    StudyAid.send(type.to_s).authored_by(self)
  end
end

2 个答案:

答案 0 :(得分:1)

我不会尝试修改all方法的行为,因为这可能会意外地改变代码其他部分的语义,并会让那些前来处理代码的人感到惊讶。

但是,您可以使用不同的名称在StudyAid上定义命名范围,例如

named_scope :every

然后你的方法可以成为:

def readable(type=:every)
  StudyAid.send(type).authored_by(self)
end

次要问题:您可以使用符号send,因此不需要to_s来电。

最后,我认为你的版本并不像你想象的那样难看。

答案 1 :(得分:1)

除非您只想使用:all,否则这应该可行:

class StudyAid
  scope :all_recs
end

def readable(type = :all_recs)
...

P.S。我不是第一次......