你如何根据子元素检索记录?条件?

时间:2014-10-16 23:58:59

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

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

我正在寻找仍然可用的所有AvailableSlots(expected_slots小于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)”,因为返回的数据不是活动记录。 / p>

最后一个问题:做某事,

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

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

1 个答案:

答案 0 :(得分:0)

您需要为拥有。

创建虚拟属性
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