我有两个班级 - logical_interfaces
和pop_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.id
是pop
所属的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
从左表中没有引用外键的右表中获取所有内容
我在想,如果它正在使用并将其用作查询中的条件,那么向表中添加新列以充当标记可能要容易得多。
答案 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 + "'")