Rails 3: Проблема фильтрации и областей «не удается преобразовать хэш в целое число»

#ruby-on-rails #scope

#ruby-on-rails #область

Вопрос:

У меня есть модель «курса», в которой есть множество временных интервалов.

В модели courses у меня есть следующие методы:

 def available_timeslots
  tsarray = []
  self.timeslots.map{ |t|
    if t.available then
      tsarray << t
    end
  }
  tsarray
end

def earliest_slot
  self.available_timeslots.first(:order => :starting_date)
end
  

Что я пытаюсь сделать сейчас, так это получить самый ранний доступный временной интервал для каждого курса. Без фильтра доступности @course.earliest_slot работает нормально. Но если я попробую @course.available_timeslots.earliest_slot возвращает сообщение «не удается преобразовать хэш в целое число».

Любые предложения приветствуются

Комментарии:

1.Непроверенная мысль: похоже, что :order => :starting_date это хэш, передаваемый first методу Array . first принимает необязательный целочисленный аргумент (например, «верните мне первые 20 элементов»). Попробуйте удалить этот аргумент в first методе. Возможно, типы объектов, возвращаемых в двух отдельных вызовах, разные (прокси?), и именно поэтому вы видите ошибку при вызове, который использует простой Array .

Ответ №1:

Комментарий Заббы верен деньгам. Метод available_timeslots возвращает массив, и вы вызываете метод сначала для этого — но это не то же самое, что сначала вызывать метод для объекта, возвращаемого ассоциацией Rails.

Я думаю, вы хотите использовать области. Итак, удалите свой метод available_timeslots и добавьте его в свой класс временных интервалов:

 scope :available, where(:available => true)
  

затем в вашем методе earliest_slot вы можете сделать

 self.timeslots.available.first(:order => :starting_date)
  

и это вернет первый доступный временной интервал для курса, на который ссылается ‘self’.

(Примечание: я делаю предположение, что ‘available’ является логическим значением. Если это что-то другое, соответствующим образом измените условие where в области.)

Комментарии:

1. Я согласен с использованием областей, но для finder, почему бы и нет: self.временные интервалы.доступны. порядок (‘starting_date’). сначала я думаю, что в Rails 3 использование #order предпочтительнее, чем передавать его в качестве аргумента. По крайней мере, так кажется из руководств.