Find_by_sql和计算字段

时间:2013-02-15 21:15:12

标签: ruby-on-rails-3 activerecord

我正在使用find my sql,我想在数据库中计算一些内容并添加到我的模型中。

我会尝试简化代码

class User < ActiveRecord::Base
   attr_accessor :comments_count

end

以及其他地方:

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u")


@user.map{|u| puts u.comments_count}

任何帮助?

2 个答案:

答案 0 :(得分:1)

不幸的是,ActiveRecord不仅会将任何选定的列与模型上的属性进行匹配。但是,类似的东西可能很容易组合在一起。首先,您需要将find_by_sql重载为类似的内容 -

def self.find_by_sql(sql)
    values = connection.select_all(sql)

    objects = []

    values.each do |row|
        objects << self.new(row)
    end

    objects
end

然后,模型的初始化函数可以批量分配基于模式的属性,然后处理分配自定义属性。它不像你可能希望的那样干净或简单的解决方案,但它应该完成任务。您可以编写初始化函数,使其相当通用,因为它可以批量分配所有基于模式的属性,然后将传入的剩余密钥与self上可能存在的任何属性进行匹配。

答案 1 :(得分:1)

好的,我明白了。 它与attr_accessor无关。我不得不将其删除。

@users = User.find_by_sql("select * (select count(*) from comments where user_id=u.id) as comments_count from Users u")

@user.map do |u|
  puts u.comments_count if @user.has_attribute?(:comments_count)
end