1

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

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

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

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

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

为了测试这一点,我将posted_posts 存根为4。这从第一个logger.debug 行打印出4,第二个logger.debug 表示它被定义为一个方法。此外,它确实进入了 else。

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

4

2 回答 2

2

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

这可能会做你想做的事。

if respond_to?(:posted_posts)
  ...
else
  ...
end
于 2012-12-06T23:49:32.597 回答
0

在你查询 AR 对象后不要使用相同的变量名,

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

然后调用@results.performance_score你的控制器

于 2012-12-07T01:34:48.977 回答