0

私には 2 つのクラスがlogical_interfacesありpop_vlans、1 対 1 の関係にあります。

表ではlogical_interfaces、外部キーはの列にvlan_id関連しています。idpop_vlans

私のコントローラーでは、sのリストを取得します(次のようにvlan_number保存されます:pop_vlans

@vlan_numbers = PopVlan.find_all_by_pop_id(@device.pop.id)

(@device.pop.idはと同じ が属しているpopです)pop_vlandevice

次に、私の見解では、このコレクションから選択を生成します。

<%= collection_select 'logical_interface', "vlan_id", @vlan_numbers, :id, :vlan_number %>

これはすべて問題ありませんが、すべてをフェッチするのではなく、テーブルで参照されていないvlan_numbersものだけをフェッチします。つまり、まだ使用されていない番号のみです。idlogical_interfaces

これは、できれば簡単なことを尋ねるにはかなり長々とした質問であるため、混乱を招いて申し訳ありません。

手動のSQLクエリで実行できると思いますが、これを「Railsの方法」で実行できる組み込みメソッドがあるかどうかはわかりません。

反対のことを達成するMySQLだと思いますが、そのクエリを調整して一致しないものSELECT pop_vlans.id, vlan_number FROM pop_vlans LEFT JOIN logical_interfaces ON logical_interfaces.id = pop_vlans.idを見つける方法を実際には考えられません。vlan_numbers

TLDR

logical_interfaces | pop_vlans
-------------------|-----------
     vlan_id-------|----->id
       ....        |  vlan_number

左側のテーブルで外部キーが参照されていない右側のテーブルからすべてを取得する

テーブルに新しい列を追加して、使用中の場合はフラグとして機能させ、それをクエリの条件として使用する方がずっと簡単かもしれないと考えています。

4

2 に答える 2

1

私が指摘したことが本当にあなたが探しているクエリである場合は、これを試すことができると思います

subQuery = Pop_vlan.all(:select=> "id,vlan_number", :joins => :logical_interfaces)

Pop_vlan.all(:select => "id,vlan_number", :conditions => ["id not in (?)", subQuery])
于 2013-08-13T16:43:33.303 に答える