3

私はfindmysqlを使用していますが、データベースで何かを計算してモデルに追加したいと思います。

コードを単純化しようとします

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}

何か助けはありますか?

4

2 に答える 2

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

于 2013-02-15T21:34:49.187 に答える
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
于 2013-02-15T22:16:50.800 に答える