Рельсы неопределенный метод для массива


В моем контроллере я пытаюсь выполнить запрос, чтобы получить все идентификаторы, на которые нет ссылок в другой таблице, например:

@vlan_numbers = ActiveRecord::Base.connection.execute("SELECT pop_vlans.id, vlan_number FROM pop_vlans WHERE pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id != " + @pop_id.to_s)

Затем, на мой взгляд, я пытаюсь использовать collection_select, чтобы показать их в выпадающем меню:

Но ошибка, которую я получаю, - это undefined method 'vlan_number' for [2, "2"]:Array, где эти значения являются только первой строкой результатов запроса.

Это диаграмма двух задействованных таблиц:

logical_interfaces | pop_vlans
-------------------|-----------
     vlan_id-------|----->id
       ....        |  vlan_number

И отношения в моделях являются:

Поп_влан.rb

belongs_to :logical_interface

Logical_interface.rb

# no relationship defined

Обновить

Вот как генерируется форма:

<%= form_tag :controller => "circuit", :action => "update" %>
    # other inputs
    <%= select_tag options_for_select(@vlan_numbers) %>
    # other inputs
 </form>
2 2

2 ответа:

Вы можете использовать select с options_for_select(@vlan_numbers) вместо collection_select

Результаты из ActiveRecord::Base.connection.execute не загружаются в модель

Вместо этого вы можете попробовать YourModelName.find_by_sql(...), Если хотите поиграть со своей моделью

Обновление Предполагая, что имя вашего атрибута, которое вы хотите, чтобы это select_tag было заполнено, является vlan_id таким образом:

<%= form_tag :controller => "circuit", :action => "update" %>
  # other inputs
  <%= select_tag 'vlan_id', options_for_select(@vlan_numbers) %>
  # other inputs
</form>

ActiveRecord::Base.connection.execute возвращает Mysql2::Result не массив объекта, как это делает запрос Arel/AR.

Таким образом, он возвращает массив массивов, содержащих pop_vlans.id, vlan_number. Так что придется использовать first или last в вашем collection_select вместо something.vlan_number

Поэтому вы должны использовать options_for_select вместо collection_select Как:

options_for_select(@vlan_numbers.collect{|v| v.first})