我应该如何编写一个数组插入来存储两个命名列,如sql查询创建的?

时间:2019-06-02 07:09:45

标签: ruby postgresql

我有大约30个项目的设置表,所有这些表都在不同的位置使用。我对应用程序控制器中的某些数据进行了一次调用,并认为我可以节省一些cpu周期并构建一些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”

以上示例中的数据并不构成所有设置变量和选项。下面是程序中将集合与直接SQL查询创建的数组'@myscosts'结合使用的方法:

<%= 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具有相同的类类型,结构和键值对。然后,我可以在像@myscosts生成的sql数组之类的集合中使用@ a2。

感谢您的回复,我希望我已经用这些附加数据回答了您的问题。

0 个答案:

没有答案