【问题标题】:How do you do retrieve records based on a child elements' condition?您如何根据子元素的条件检索记录?
【发布时间】:2014-10-16 23:58:59
【问题描述】:

我有一个具有“max_attendees”属性的模型 AvailableSlot。 AvailableSlot has_many BookedSlots。

我正在寻找所有仍然可用的 AvailableSlots(其中预定的槽位小于 max_attendees")

我试过了

scope :with_capacity, -> { joins('LEFT OUTER JOIN booked_slots on booked_slots.available_slot_id = available_slots.id')
.group('available_slots.id').having("booked_slots.count < available_slots.max_attendees") }

  #AvailableSlot.rb
  def self.with_capacity
    self.select{ |s| s.booked_slots.count < s.max_attendees }
  end

但是这些返回数组,第一个不能做“.count”,第二个解决方案不能做“.limit(3)”,因为返回的数据不是活动记录。

最后一个问题:对于做类似的事情,

AvailableSlot.joins(:booked_slots).where("booked_slots.length < ?, max_attendees) 

我不能使用 .length,因为它不是booked_slots 下的列。在使用 .count、.length 等 activerecord 方法的同时使用这种 .joins.where 格式的方法是什么?

【问题讨论】:

    标签: sql ruby-on-rails activerecord ruby-on-rails-4 orm


    【解决方案1】:

    您需要为拥有创建一个虚拟属性。

    AvailableSlot.
      joins('LEFT OUTER JOIN booked_slots on booked_slots.available_slot_id = available_slots.id').
      select('available_slots.*, count(booked_slots) as booked_slots_count').
      group('available_slots.id').
      having('booked_slots_count < max_attendees')
    

    这也会向模型公开一个虚拟属性。

    请注意,这会使.count 更加复杂,您必须将爵士乐传递给它,请查看文档中可用的选项:http://apidock.com/rails/ActiveRecord/Calculations/ClassMethods/count

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多