如何查找引用的外键

时间:2013-08-13 14:56:09

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

我有两个班级 - logical_interfacespop_vlans,并且一对一的关系。

logical_interfaces表中,外键为vlan_id,与id中的pop_vlans列相关。

在我的控制器中,我得到vlan_number的列表(存储在pop_vlans中,如此:

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

@device.pop.idpop所属的pop_vlan,与device相同

然后在我看来我从这个集合中生成一个选择:

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

这一切都很好,但我不想提取所有 vlan_numbers,只有那些id未在logical_interfaces中被引用的人}表。即只有那些尚未使用的数字。

我非常抱歉这个混乱,因为这是一个非常冗长的问题,可以提出一些希望直截了当的事情。

我认为可以通过手动SQL查询来完成,但我不知道是否有内置方法可以完成这些Rails方式&#39;。

我认为实现相反的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

从左表中没有引用外键的右表中获取所有内容

我在想,如果它正在使用并将其用作查询中的条件,那么向表中添加新列以充当标记可能要容易得多。

2 个答案:

答案 0 :(得分:1)

如果我所说的话确实是您正在寻找的查询,我想您可以试试这个

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

Pop_vlan.all(:select => "id,vlan_number", :conditions => ["id not in (?)", subQuery])

答案 1 :(得分:0)

只是帮助任何人,我能够做到这一点:

@vlan_numbers = ActiveRecord::Base.connection.execute("SELECT pop_vlans.id, vlan_number FROM pop_vlans WHERE (pop_id = '" + @pop_id.to_s + "' AND vlan_number = '" + @vlan_number.to_s + "') OR (pop_id = '" + @pop_id.to_s + "' AND vlan_number = 'Untagged') OR pop_vlans.id NOT IN (SELECT logical_interfaces.vlan_id FROM logical_interfaces) AND pop_id = '" + @pop_id.to_s + "'")