【问题标题】:Rails undefined method for arrayRails未定义的数组方法
【发布时间】:2013-08-14 08:39:39
【问题描述】:

在我的控制器中,我试图运行一个查询以获取所有未在另一个表中引用的 id,如下所示:

@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

模型中的关系是:

pop_vlan.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>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-2


    【解决方案1】:

    您可以将selectoptions_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>
    

    【讨论】:

    • 谢谢,但使用 &lt;%= select options_for_select(@vlan_numbers) %&gt; 会出现以下错误消息 - wrong number of arguments (1 for 3)
    • select_tag 可能...取决于您如何构建表单如果您使用的是 form_for 然后 f.select :vlan_id, options_for_select(@vlan_numbers) 鉴于 f 是您的表单构建器的实例
    • 你的意思是&lt;%= select_tag options_for_select(@vlan_numbers) %&gt;?使用它,我的选择菜单不会填充任何选项。
    • 你能提供一些关于你如何生成表单的sn-ps吗?
    • @jo3w,我已经更新了问题,每个输入只是通过适当的辅助函数手动插入到视图中,例如 text_fieldcheck_box
    【解决方案2】:

    ActiveRecord::Base.connection.execute 返回 Mysql2::Result 而不是 Arel/AR 查询所返回的对象数组。

    所以它返回包含pop_vlans.id, vlan_number 的数组数组。所以必须在你的 collection_select 中使用 first 或 last 而不是 something.vlan_number

    所以你必须使用options_for_select 而不是collection_select 像:

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

    【讨论】:

    • 谢谢,但我不太清楚你的意思,你有例子吗?
    • @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) 的样本输出可能是 [[1,3], [2,3], [4,5], [3,1]]。所以如果你在 collection_select 中使用 [[1,3], [2,3], [4,5], [3,1]] 你必须对数组进行操作,所以你不应该在数组中找到vlan_number
    • 我想我现在明白你的意思了,所以,下一个问题是,如何获取每个数组的最后一个成员?例如使用您的示例 3,3,5,1 但请记住,我需要每个数组的第一个成员作为选择的值。
    猜你喜欢
    • 2011-11-19
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2014-04-04
    • 2013-02-05
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多