У меня есть установочная таблица из примерно 30 предметов, которые используются в разных местах. Я сделал один вызов для некоторых данных в контроллере приложения и подумал, что мог бы сохранить некоторые циклы ЦП и встроить некоторые вызовы collection_select sql в виде массивов, созданных с первого прохода в таблицу установки.
У меня есть одна коллекция, в которой требуется передать два значения из БД.
Я могу создать массив, который передает только один столбец в collection_select. Я врезаюсь в стену, когда пытаюсь передать два столбца данных. Вот массив, построенный с помощью вызова sql, с результирующими данными.
@myscosts = Setmeup.find_by_sql("select (t_is || '--' || description) as shipr, description::float as cost from setmeups where active is true and g_is = 'Ship' order by t_is, srby;")
shipr | cost
----------------------+------
FedEx_Large--17.00 | 17
FedEx_Medium--7.00 | 7
FedEx_Small--5.00 | 5
Self_Delivery--1.00 | 1
USPS_2d_Large--9.00 | 9
USPS_2d_Medium--5.00 | 5
USPS_2d_Small--3.00 | 3
(7 rows)
В контроллере приложения у меня есть этот код:
@setups = Setmeup.find_by_sql("select g_is, t_is, srby, description from setmeups where active = 'true' order by g_is, srby;")
# puts @setups.class
@setups.each do |f|
@title = "#{f.description}" if "#{f.g_is}" == "App" && "#{f.t_is}" == "Title"
(more code here, the next stanza works for a collection)
if f.t_is == 'Process' then
@steps << "#{f.srby} - #{f.description}"
end
(I can not find the right way to make this one work.)
if "#{f.g_is}" == 'Ship' then
@shpr = "#{f.t_is} -- #{f.description}"
@cst = "#{f.description}".to_f
@myscosts << "[#{@cst}, #{@shpr} ]"
end
(results of above in log..)
myscosts == ["[5.0, FedEx_Small -- 5.00]", "[3.0, USPS_2d_Small -- 3.00]", "[1.0, Self_Delivery -- 1.00]", "[5.0, USPS_2d_Medium -- 5.00]", "[7.0, FedEx_Medium -- 7.00]", "[9.0, USPS_2d_Large -- 9.00]", "[17.0, FedEx_Large -- 17.00]"]
Шаг проверки Rails выдает ошибку, поскольку переданное значение:
"shipping_quoted" => "[\" 5.0 \ ", \" FedEx_Small - 5.00 \ "]" не является числом.
Это передается, когда SQL-запрос создает массив:
"Shipping_quoted" => "5,0"
Данные в приведенном выше примере не составляют все переменные и параметры настройки. Ниже приведен метод использования в программе коллекции с массивом «@myscosts», созданным прямым запросом sql:
<%= form.label :shipping_quoted %>
<%= form.collection_select :shipping_quoted, @myscosts, :cost, :shipr %>
Это collection_select У меня возникли проблемы с динамическим созданием массива, который имитирует результат запроса sql. Вот пример коллекции collection_select (с передачей только одного значения), которую я могу заставить работать (но я не понимаю, как: to_s действует как псевдоним):
<%= form.label :step %>
<%= form.collection_select :step, @steps, :to_s, :to_s %>
Я надеюсь, что кто-нибудь поможет мне понять, как сделать что-то вроде этого:
(в модели или контроллере)
@a1 = sql("select * from xytable";) # where @a1[0..n].y = 'Y'
@a1.each do |k|
if k.y != 'Y'
@a2 << "#{k}" # or "#{k.inspect}"
end
end
Таким образом, массив @ a2 имеет те же пары типов классов, структур и ключей, что и массив @ a1. Затем я мог бы использовать @ a2 в коллекции, такой как массив sql, сгенерированный как @ myscosts.
Спасибо за ваш ответ, надеюсь, я ответил на ваши вопросы с этими дополнительными данными.