2

私のコントローラーでは、クエリを実行して、次のように別のテーブルで参照されていないすべての 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、これらの値がクエリの結果の最初の行にすぎないことです。

これは、関連する 2 つのテーブルの図です。

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>
4

2 に答える 2

4

selectoptions_for_select(@vlan_numbers)代わりに使用できますcollection_select

results fromActiveRecord::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>
于 2013-08-14T08:53:19.767 に答える
1

ActiveRecord::Base.connection.executeArel Mysql2::Result/AR クエリが行うように、オブジェクトの配列ではありません。

したがって、 を含む配列の配列を返します pop_vlans.id, vlan_number。そのため、代わりに collection_select で first または last を使用する必要がありますsomething.vlan_number

したがって、 likeoptions_for_selectの代わりに使用する必要があります。collection_select

options_for_select(@vlan_numbers.collect{|v| v.first}) 
于 2013-08-14T08:50:50.313 に答える