gpt4 book ai didi

ruby-on-rails - Rails 查询一个 has_many :through conditionally with multiple ids

转载 作者:数据小太阳 更新时间:2023-10-29 08:46:38 25 4
gpt4 key购买 nike

我正在尝试通过 LocationFeature 模型为具有位置和功能的网站构建过滤系统。基本上它应该做的是根据要素 ID 的组合为我提供所有位置。

例如,如果我调用方法:

Location.find_by_features(1,3,4)

它应该只返回具有所有 所选特征的位置。因此,如果位置具有 feature_ids [1, 3, 5],则不应返回,但如果它具有 [1, 3, 4, 5],则应该。但是,目前它给我的位置有其中之一。所以在这个例子中它返回两个,因为一些 feature_ids 存在于它们中的每一个中。

这是我的模型:

class Location < ActiveRecord::Base
has_many :location_features, dependent: :destroy
has_many :features, through: :location_features

def self.find_by_features(*ids)
includes(:features).where(features: {id: ids})
end
end

class LocationFeature < ActiveRecord::Base
belongs_to :location
belongs_to :feature
end

class Feature < ActiveRecord::Base
has_many :location_features, dependent: :destroy
has_many :locations, through: :location_features
end

显然这段代码没有按照我想要的方式工作,我无法理解它。我也尝试过这样的事情:

Location.includes(:features).where('features.id = 5 AND features.id = 9').references(:features)

但它什么也没有返回。使用 OR 而不是 AND 再次给我。我也试过:

Location.includes(:features).where(features: {id: 9}, features: {id: 1})

但这只是给了我 feature_id 为 1 的所有位置。

查询匹配所有请求特征的位置的最佳方式是什么?

最佳答案

当你执行包含时,它会在内存中创建一个“伪表”,其中包含表 A 和表 B 的所有组合,在本例中连接到外键。 (在这种情况下,已经包含一个连接表 (feature_locations),使事情复杂化。)

此表中不会有任何行满足条件 features.id = 9 AND features.id = 1。每行将只有一个 features.id 值。

为此我要做的是忘记功能表:您只需要查看连接表 location_features,以测试是否存在特定的 feature_id值。我们需要一个查询来比较此表中的 feature_id 和 location_id。

一种方法是获取特征,如果关联了 location_ids(它只是调用连接表),则获取数组集合,然后查看所有数组中有哪些位置 ids:(i已将您的方法重命名为更具描述性)

#in Location
def self.having_all_feature_ids(*ids)
location_ids = Feature.find_all_by_id(ids).map(&:location_ids).inject{|a,b| a & b}
self.find(location_ids)
end

注意1:params中*ids中的星号表示它将把一个参数列表(包括单个参数,类似于“一个列表”)转换为单个数组。

注意 2:inject 是一个方便的设备。它说“在数组中的第一个和第二个元素之间执行此代码,然后在这个和第三个元素的结果之间,然后是 this 的结果和第四个元素,等等,直到你到达结束。在这种情况下,我在每对(a 和 b)中的两个元素之间执行的代码是“&”,在处理数组时,它是“集合交集运算符”——这将仅返回元素在两对中。当你完成数组列表时,只有所有数组中的元素才会存活下来。这些是与所有给定特征相关联的位置的 ID。

编辑:我确定有一种方法可以通过单个 sql 查询来执行此操作 - 可能使用 group_concat - 其他人可能会很快发布 :)

关于ruby-on-rails - Rails 查询一个 has_many :through conditionally with multiple ids,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26143595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com