Рельсы неопределенный метод для массива
В моем контроллере я пытаюсь выполнить запрос, чтобы получить все идентификаторы, на которые нет ссылок в другой таблице, например:
@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 ответа:
Вы можете использовать
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})