0

我有两个班级 -logical_interfaces并且pop_vlans是一对一的关系。

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

在我的控制器中,我得到一个vlan_numbers 列表(pop_vlans像这样存储:

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

@device.pop.id是属于的pop那个pop_vlan和那个是一样的device

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

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

这一切都很好,但我不想获取所有vlan_numbers,只获取表id中未引用的那些logical_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 回答
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 + "'")
于 2013-08-23T10:53:40.410 回答