替换" has_many ... counter_sql"在Rails 4.1中

时间:2014-04-10 12:38:14

标签: ruby-on-rails activerecord ruby-on-rails-4 ruby-on-rails-4.1

Rails 4.1从counter_sql关联中删除了has_many,因此以下内容不再有效:

class Project < ActiveRecord::Base

  has_many :backers,
    -> { select('COMPLEX SQL QUERY') },
    through: :pledges,
    source: :backer,
    counter_sql: proc { "COMPLEX COUNT SQL QUERY" }

  (...)
end

我需要counter_sql,因为select中的COMPLEX SQL QUERY,AR project.backers.count时无法构建有效的SQL。

要解决此问题,我将其移至类似的方法:

class Project < ActiveRecord::Base

  has_many :backers,
    -> { select('COMPLEX SQL QUERY') },
    through: :pledges,
    source: :backer

  def backers_count
    self.class.count_by_sql 'COMPLEX SQL QUERY'
  end

  (...)
end

这是一个好方法还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用关联扩展程序

class Project < ActiveRecord::Base
  has_many :backers,
    -> { select('COMPLEX SQL QUERY') },
    through: :pledges,
    source: :backer do

    def count
      #query here
    end
  end
end

关联代理以proxy_association的形式提供,特别是proxy_association.owner返回项目对象。

这会覆盖默认提供的计数方法,因此some_project.backers.count会调用您的自定义查询