1

Rails 4.1 删除了counter_sqlfromhas_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在这里,因为在使用 COMPLEX SQL QUERY 时select,AR 在我这样做时不会构建有效的 SQL project.backers.count

要解决此问题,我会将其移至如下方法:

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

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

4

1 回答 1

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返回项目对象。

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

于 2014-04-11T13:23:30.073 回答