【发布时间】:2012-12-06 23:42:41
【问题描述】:
我的 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 应用程序会失败吗?
【问题讨论】:
-
@writers = @writers.select看起来很有趣。什么是@writers(选择前后)?通常,我们会使用Writer has_many :total_posts之类的东西,它可以让ActiveRecord 处理respond_to? :total_posts和true。 -
只是一个小注——
unless / else不清楚,可以随时改写为if / else。 -
我将 .joins(...) 添加到我最初的问题中,以使其更清楚我在做什么。如果有帮助,这是实际的连接:
.joins("LEFT OUTER JOIN (SELECT writer_id, count(*) as total_posts, sum(case when state = 'posted' then 1 else 0 end) as posted_posts, sum(case when state = 'rejected' then 1 else 0 end) as rejected_posts, max(created_at) as last_created_post FROM posts WHERE customer_id != 11 GROUP BY writer_id) as p ON p.writer_id = writers.id")
标签: ruby-on-rails ruby operators defined