#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 предпочтительнее, чем передавать его в качестве аргумента. По крайней мере, так кажется из руководств.