2015-06-06 3 views
2

Похоже, я подошел. Мой текущий запрос этоПолучите массив значений атрибутов вместе с атрибутом из соединения

items = Item.select("items.icon, items.name, item_types.name AS type, items.level, items.rarity, items.vendor_value") 
.joins(:item_type) 
.where("item_types.name = '#{params[:item_type]}'") 

Это заставляет меня массив объектов предмет, по крайней мере, реагирующих на :type с item_type.name.

То, что я ищу это массив массивов, которые выглядят так:

[icon, name, item_type.name, level, rarity, vendor_value] 

Я уже это работает довольно легко, но для меня важно, чтобы это было сделано одним махом с помощью sql, вместо того, чтобы впоследствии создавать карту, потому что есть моменты, когда мне нужно отвечать с помощью элементов 40k +, и нужно, чтобы это было как можно быстрее.

Не уверен, как перейти от приведенного выше к массиву атрибутов, не выполняя карту.

Благодарим за помощь!

ответ

3

Метод pluck делает именно то, что вы хотите. В вашем случае, это будет выглядеть следующим образом:

items = Item.joins(:item_type) 
      .where("item_types.name = ?", params[:item_type]) 
      .pluck("items.icon", "items.name", "item_types.name AS type", 
        "items.level", "items.rarity", "items.vendor_value") 

Я также изменил where вызов использовать параметризацию вместо строки интерполяции-интерполяции не рекомендуется, особенно, когда вы получаете значение от пользователя.

Дальнейшее чтение:

Official documentation for pluck

An in-depth explanation of how to use pluck

+0

Спасибо! Я использовал срывать, но не с несколькими значениями раньше. Я не знал, что это возможно. Очень полезно. – Borromakot

Смежные вопросы