Измените метод экземпляра на has_many в Rails.

has_many.rb

  has_many :child_attendances, -> (attendance) {
    includes(:activity).references(:activity).
      where(activities: {parent_activity_id: attendance.activity_id}).
      where(
        Attendance.arel_table.grouping(
          Attendance.arel_table[:attendant_id].eq(attendance.attendant_id).
          and(Attendance.arel_table[:attendant_type].eq(attendance.attendant_type))
        ).
        or(Attendance.arel_table[:tag_code].eq(attendance.tag_code))
      )
  }, class_name: 'Attendance', dependent: :destroy

методы.rb

  def self.child_attendances(attendance)
    includes(:activity).references(:activity).
    where(activities: {parent_activity_id: attendance.activity_id}).
    where(
      Attendance.arel_table.grouping(
        Attendance.arel_table[:attendant_id].eq(attendance.attendant_id).
          and(Attendance.arel_table[:attendant_type].eq(attendance.attendant_type))
      ).
        or(Attendance.arel_table[:tag_code].eq(attendance.tag_code))
    )
  end

  def child_attendances
    self.class.child_attendances(self)
  end

При использовании has_many.rb

-- attendance.child_attendances.to_sql
SELECT "attendances"."id" AS t0_r0 FROM "attendances" LEFT OUTER JOIN "activities" ON "activities"."id" = "attendances"."activity_id" WHERE "activities"."parent_activity_id" = 654 AND (("attendances"."attendant_id" IS NULL AND "attendances"."attendant_type" IS NULL) OR "attendances"."tag_code" = '123456789') AND "attendances"."attendance_id" = 164513

Он добавляет «посещаемость». «attendance_id» = 164513, аttence_id не является допустимым столбцом для посещаемости.

При использовании методов.rb

-- attendance.child_attendances.to_sql
SELECT "attendances"."id" AS t0_r0 FROM "attendances" LEFT OUTER JOIN "activities" ON "activities"."id" = "attendances"."activity_id" WHERE "activities"."parent_activity_id" = $1  AND (("attendances"."attendant_id" IS NULL AND "attendances"."attendant_type" IS NULL) OR "attendances"."tag_code" = '123456789')  [["parent_activity_id", 654]]

Как превратить другой фрагмент в has_many? Кажется, что Rails всегда ищет Primary_key и Foreign_key для объединения при использовании has_many.


person Rafael Oliveira    schedule 16.07.2016    source источник


Ответы (1)


Согласно https://stackoverflow.com/a/34444220, то, что я пытался сделать, не имеет смысла создавать с использованием has_many , поэтому я придерживаюсь метода экземпляра.

  def child_attendances
    self.class.includes(:activity).references(:activity).
    where(activities: {parent_activity_id: activity_id}).
    where(
      Attendance.arel_table.grouping(
        Attendance.arel_table[:attendant_id].eq(attendant_id).
          and(Attendance.arel_table[:attendant_type].eq(attendant_type))
      ).
        or(Attendance.arel_table[:tag_code].eq(tag_code))
    )
  end
person Rafael Oliveira    schedule 19.07.2016