Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3.2-HABTM仅检索没有子女的父母_Ruby On Rails_Has And Belongs To Many - Fatal编程技术网

Ruby on rails Rails 3.2-HABTM仅检索没有子女的父母

Ruby on rails Rails 3.2-HABTM仅检索没有子女的父母,ruby-on-rails,has-and-belongs-to-many,Ruby On Rails,Has And Belongs To Many,我意识到有几篇关于这方面的文章(或者至少是类似的主题),但这些解决方案都不适合我 首先,不要建议“你应该用过很多次!”。你可能是对的,但我们现在已经超过了这个选项:) 基本上,我在建筑物和用户之间有一种HABTM关系。我试图做的是只检索没有用户的建筑物。下面是我现在使用的代码: Building.includes(:users).where(:users => { :id => nil}) 这是返回也有用户的建筑物(尽管所有人都认为不应该如此) 我不确定此代码是否不起作用,因为它是

我意识到有几篇关于这方面的文章(或者至少是类似的主题),但这些解决方案都不适合我

首先,不要建议“你应该用过很多次!”。你可能是对的,但我们现在已经超过了这个选项:)

基本上,我在建筑物和用户之间有一种HABTM关系。我试图做的是只检索没有用户的建筑物。下面是我现在使用的代码:

Building.includes(:users).where(:users => { :id => nil})
这是返回也有用户的建筑物(尽管所有人都认为不应该如此)

我不确定此代码是否不起作用,因为它是HABTM关系,还是因为我在建筑物和用户/业主之间存在“双重”HABTM关系,即:

building.rb

has_and_belongs_to_many :users, :uniq => true
has_and_belongs_to_many :owners, :class_name => 'User', :foreign_key => 'building_id', :association_foreign_key => 'owner_id', :uniq => true
user.rb

has_and_belongs_to_many :buildings, :uniq => true
has_and_belongs_to_many :owned_buildings, :class_name => 'Building', :foreign_key => 'owner_id', :association_foreign_key => 'building_id', :uniq => true
理想情况下,我希望归还所有没有用户和所有者的建筑物(即,对于要归还的建筑物,它需要没有用户也没有所有者),但在这一点上,我可以只归还没有用户的建筑物(不考虑所有者)

应该注意的是,上面的代码确实成功地返回了所有没有所有者的建筑物(不是我要找的,但很接近),这对我来说毫无意义。我检查了连接表,数据看起来很好(没有任何东西让我相信数据已经损坏)

我只想使用计数器缓存并测试计数器是否为0,但计数器缓存并不是针对HABTM自动实现的,仅仅为了解决这个问题而实现计数器缓存似乎很有难度(我已经了解到,针对HABTM实现您自己的计数器缓存并不能覆盖所有创建/删除情况的100%)

有什么想法吗

更新

到目前为止,这是我能想到的唯一有效的方法(用于寻找没有用户或业主的建筑物):

我必须创建以下“连接模型”(从我创建HABTM时起,表就已经在那里了)才能正常工作:

建筑物用户.rb

class BuildingsUser < ActiveRecord::Base
  belongs_to :building
  belongs_to :user
end
class BuildingUser

这感觉很粗糙(而且效率很低),但它确实有效。显然,我想要一个更好的解决方案。

如果您不介意使用原始SQL,我会这样做

Building.where('NOT EXISTS(SELECT 1 FROM buildings_users WHERE building_id = buildings.id)')

这基本上可以获取连接表中没有记录的所有建筑物(假设连接表名称为buildings\u users,但我可能在这一点上错了。

您是否尝试过
Building.includes(:users,:owner)。其中(:users=>{:id=>nil})
?@Yoshiji先生好主意,但我得到了同样的结果,他们成功了!谢谢!你知道为什么你的解决方案有效,而其他无数的解决方案无效吗?是因为我的“双HABTM”吗使用相同的类?没有HABTM经常在两种方式中使用。我必须检查这些答案,以确定它们在您的案例中不起作用的原因
Building.includes(:users)。其中(:users=>{:id=>nil})
是大多数SO解决方案所说的应该起作用的地方
Building.where('NOT EXISTS(SELECT 1 FROM buildings_users WHERE building_id = buildings.id)')