Не могу получить ассоциацию рельсов, чтобы ограничить столбцы с JSON
У меня есть приложение для ресторана, которое я создаю и которое позволяет ресторанам создавать меню онлайн. Прямо сейчас наша страница загружает 6 элементов при начальной загрузке страницы, и затем происходит бесконечное взаимодействие прокрутки, поскольку они продолжают прокручивать страницу вниз и динамически загружать еще 6 элементов через AJAX.
Все работает, но у меня возникают проблемы с ограничением полей ассоциаций моей базы данных. Например, мои элементы имеют свои размеры, которые устанавливаются в модели элементов с помощью
has_many :sizes
а затем я получаю доступ к этим размерам, используя
item.sizes
чтобы организовать свои данные для возврата через json, я использую следующий метод (хотя я весьма приветствую улучшения этого метода):
items = Item.where("blah blah")
items.each do |item|
item[:sizes] = item.sizes
end
render :json => {:items => items}
Все это работает и достаточно просто, но когда я пытаюсь ограничить выбранные столбцы, возвращаемые из базы данных, я начинаю странно себя вести. Я не уверен, что вызывает это. Я пытался сделать это:
item[:sizes] = item.sizes.select("id, name, price")
и я попытался сделать это также:
item[:sizes] = item.sizes.to_json(:only => [:id, :name, :price])
оба эти метода работают для возврата только запрошенных полей на стороне сервера, но между запросом и возвратом в веб-браузер, кажется, что-то происходит (кажется, что это вызвано методом рендеринга), что отменив мои уникальные селекторы полей и вместо этого отправив обратно все данные базы данных (поэтому вместо только идентификатора, имени, цены я получаю около 20 ненужных полей данных).
Я ищу любые предложения, которые могли бы помочь сделать эту работу. Кроме того, если у кого-то есть какая-либо другая информация о способах улучшения времени запросов, это также будет высоко оценено. Я уже рассмотрел все основные учебные пособия, и я уже использую готовую загрузку перед доступом к элементам (интересно, это как-то связано с моими проблемами?), Но я пытаюсь найти хорошие решения, чтобы предотвратить возникновение узкого места этими методами to_json и render:json.
В настоящее время последовательность запросов, которая занимает около 400 мс для базы данных, требует дополнительных 1000 мс для рендеринга: json.
1 ответ
Вы должны ограничить элементы, передав свои параметры render
метод как это:
render :json => items.to_json(:include => { :sizes => { :only => [:id, :name, :price] }}
это должно сделать это для вас.