2013-09-05 10 views
1

У меня есть приложение Rails 2, в разработке все работает отлично, но в производстве одно из моих представлений сломано, и мне трудно найти причину.Rails Debugging

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

Во-первых, если I хвоста журнала, ошибка я получаю:

ActionView::TemplateError (undefined method 'map' for #<Mysql::Result:0xb5ce7844>) on line #15 of app/views/logical_interface/create.rhtml:

Линия 15 является

<%= select_tag 'logical_interface[vlan_id]', options_for_select(@vlan_numbers.map(&:reverse)) %> 

который определен в контроллере, как

@pop_id = session[:pop_id] 

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

Я проверил @pop_id, чтобы узнать, не получилось ли оно использовать его было ноль и т. д., но распечатка его показывает правильное значение.

Если удалить строку 15 и добавьте <%= @vlan_numbers.inspect %> все, что я получаю # и если я debug @vlan_numbers#<Mysql::Result:0xb5db1298> я получаю, так что я действительно тупик.

Я посмотрел, есть ли что-нибудь в mysql2, которого не было в mysql, но все, что я мог найти, это то, что mysql2 в целом лучше.

Любые идеи?

Update

@vlan_numbers = ActiveRecord::Base.connection.select_all("SELECT pop_vlans.id, vlan_number FROM pop_vlans WHERE (pop_id = '" + @pop_id.to_s + "' AND vlan_number = 'Untagged') OR pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id = " + @pop_id.to_s).collect { |r| r['vlan_number'] } 

Я попытался с помощью выше, как предложил мой mbratch (ответ теперь был удален), но это немного своеобразный, потому что Untagged вариант, который добавляется к списку уже это текст почитали так что это deggatnU. Я думаю, что то же самое происходит с значениями выбора (которые выглядят так, как будто они представляют собой текст вместо фактического id из таблицы).

+0

Я немного озадачен вашим утверждением, что * по какой-то причине разработка использует камень mysql2 *. Вы должны контролировать, какой жемчуг использует ваша среда разработки, чтобы сделать его более похожим на вашу производственную среду. Ваш 'config/environment.rb' говорит что-нибудь о' mysql' gem? – lurker

+0

ничего в 'config/environment.rb'.Я имею в виду, что я ожидал бы, что оба драгоценных камня будут одинаковыми, а также для производства использовать 'mysql2', поскольку он« лучше ». – martincarlin87

+0

При переходе на производство вы можете или не иметь контроль над тем, что находится на этом сервере (если для Например, вы идете вживую на героку). Поэтому иногда вам приходится соответствовать разработке и производству. Но если вы управляете обоими, тогда вы можете установить свой 'config/environment.rb' в соответствии с выбором правильного драгоценного камня. – lurker

ответ

2

Опираясь на то, что дало @Vimsha, вы могли бы попробовать это, который будет создавать массив (список) [id, vlan_number] пар:

@vlan_numbers = ActiveRecord::Base.connection.select_all("SELECT vlan_number, pop_vlans.id FROM pop_vlans WHERE (pop_id = '" + @pop_id.to_s + "' AND vlan_number = 'Untagged') OR pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id = " + @pop_id.to_s).map(&:values) 

И избавиться от .map(&:reverse) по линии 15.

Если вы хотите, чтобы сделать это действительно зависит от того, что SELECT производит, а затем немного длиннее рук:

@vlan_numbers = ActiveRecord::Base.connection.select_all("SELECT vlan_number, pop_vlans.id FROM pop_vlans WHERE (pop_id = '" + @pop_id.to_s + "' AND vlan_number = 'Untagged') OR pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id = " + @pop_id.to_s).map { |r| [r["vlan_number"], r["id"]] } 
+0

спасибо, это __almost__ perfect. Теперь вариант выбора варианта: '', но я не хочу, чтобы в тексте было значение 'id' или значение' vlan_number', любые идеи, как это исправить? Я понял о методе «обратного», как и вы, поэтому я избавился от этого. Я мог бы, вероятно, использовать jQuery, чтобы исправить vlaues и варианты текста, но это было бы просто полным взломом. – martincarlin87

+0

@ martincarlin87, я не совсем уверен, но думаю, причина в том, что ваш элемент данных является 'logical_interface', но значение является' id', поэтому он дает вам 'id4098', так как это не является значением' logical_interface'. Что вы действительно выбираете (и хотите, чтобы пользователь установил в db), используя этот элемент? Вы выбираете логический интерфейс или выбираете vlan_id, который соответствует логическому интерфейсу? Если последнее, то я бы использовал 'select_tag vlan_id ...' и обозначил его как «Логический интерфейс». – lurker

+0

Я получаю 'vlan numbers' в моем контроллере' logical interface', так как существует взаимно-однозначное отношение, и мне нужно, чтобы пользователь мог выбрать 'vlan number' (таблица' 'pop_vlans' будет равна более запутанным), чей 'id' (' vlan_id') хранится как внешний ключ в таблице 'logical_interfaces'. Поэтому вместо того, чтобы сбрасывать 'vlan ids' в select, я пытаюсь показать пользователю что-то более содержательное, например,' vlan_number'. – martincarlin87

0

Вы получаете эту ошибку, потому что @vlan_numbers является объектом Mysql :: Result, а не массивом. Если вы хотите, чтобы получить массив, сделать это

@vlan_numbers = ActiveRecord::Base.connection.select_all("SELECT pop_vlans.id, vlan_number FROM pop_vlans WHERE (pop_id = '" + @pop_id.to_s + "' AND vlan_number = 'Untagged') OR pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id = " + @pop_id.to_s) 
+0

спасибо, используя ваш ответ, я получаю эту различную ошибку 'ActionView :: TemplateError (undefined method 'reverse' для {" id "=>" 12289 "," vlan_number "=>" Untagged "}: Hash) в строке # 15 app/views/logical_interface/create.rhtml: ' – martincarlin87

+0

также, используя это на dev также ломает его. – martincarlin87

+1

'select_all' возвращает массив хэшей атрибутов. Что вы хотите, чтобы оно выглядело, как обрабатывать его? Возможно, вам придется немного массировать вывод 'select_all' немного в Ruby, чтобы получить то, что вам нужно. Кроме того, что вы подразумеваете под «использованием того, что на dev тоже ломает его»? Вы должны быть конкретными о том, что означает «перерывы». :) – lurker