如何为具有连接表的关联编写范围?

时间:2013-11-17 01:22:45

标签: ruby-on-rails activerecord

我有这个:

class Attendance < ActiveRecord::Base

    has_and_belongs_to_many :shirts,
        join_table: "attendances_shirts",
        association_foreign_key: "shirt_id", foreign_key: "attendance_id"

        # I'd like to be able to write this scope, specifying
        # only the attendances that have shirt records
        scope :with_shirts, ??????

end

我有一些加入的例子,在哪里,但我没有发现它们非常直接。

同样,我希望帮助选择出勤率至少有一件衬衫记录的人数。

1 个答案:

答案 0 :(得分:0)

很遗憾,如果没有加入,你就无法做到这一点。范围是返回关联对象,因此所有“计算”都需要在db内执行。 db能够确定哪些出席有衬衫的唯一方法是进行加入。

scope :with_shirts, select("#{table_name}.*").joins(:shirts).group(:id)

更新:

要处理返回哈希的计数,你可能会这样做:

scope :with_shirts, select("#{table_name}.*").joins(:shirts).group(:id).extending do
  def count
    super.length
  end
end