Ruby定义的问题? Rails中的运算符

时间:2012-12-06 23:42:42

标签: ruby-on-rails ruby operators defined

我的Writer类上有一个使用已定义的实例方法?运算符检查并查看是否定义了published_posts:

def performance_score
  logger.debug posted_posts
  logger.debug defined?(posted_posts)
  unless defined?(posted_posts)
    ...
  else
    ...
  end
end

在我的控制器中,我有一个如下定义的编写器实例:

@writers = Writer.select("writers.*, p.total_posts, p.posted_posts").joins(...)

当我调用@ writers.performance_score时,从第一个logger.debug行开始,它说我有4个posted_posts,但第二个打印出来没有。此外,它进入除非部分而不是其他部分。

为了测试这个,我将published_posts存根到4.这从第一个logger.debug行输出4,第二个logger.debug表示它被定义为方法。此外,它确实进入了其他地方。

你能帮我理解为什么我的Rails应用程序失败了吗?

2 个答案:

答案 0 :(得分:2)

实际上可能会失败,因为从您的AREL select语句返回的关系使用method_missing magic来从调用中返回一个值。这与defined不同。当您在测试对象上模拟/存根“方法”时,可能正在使用创建已定义函数的define_method函数。

这可能会做你想要的。

if respond_to?(:posted_posts)
  ...
else
  ...
end

答案 1 :(得分:0)

在查询AR abject之后不要使用相同的变量名,

@results = @writers.select("writers.*, p.total_posts, p.posted_posts")

然后在控制器中调用@results.performance_score