- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试通过 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/
我有一个具有以下模型的应用程序:- 类别- 子类别- 产品- 产品子类别 我的关系如下: Category has_many :subcategories Subcategory belongs_to
看来 rails 仍然不支持这种类型的关系并抛出 ActiveRecord::HasManyThroughAssociationPolymorphicThroughError 错误。 我该怎么做才能实
我想知道我可以在多大程度上使用 Rails 中的关联。考虑以下因素: class User :provider end class Provider :businesses belongs
我是 Rails 的新手。我想知道我是否需要将 add_index 添加到两个迁移? 我正在尝试定义用户和事件。每个用户可以有多个事件,每个事件可以有多个用户。所以我会做这样的事情: class Us
我有这个: class User :series end class Serial :serials end class Episode < ActiveRecord::Base belong
我一直致力于一个大量使用模型关联的项目,似乎我发现了 has_many 或 has_one through 功能与 :conditions 功能冲突的情况。简而言之,问题是 through 关联为 h
模拟以下情况的最佳方法是什么: Word belongs_to :wordable, :polymorphic => true Phrase has_many :words, :as => :
这似乎是一个典型的问题,但很难搜索。 我想选择用户通过 has_many 拥有的项目和用户通过 has_many through 关联的项目。 考虑以下模型: class User < ActiveR
首先对英语感到抱歉 所以我已经有了“用户 - 帖子”一对多关联,这意味着每个帖子只能有一个作者,现在我想在用户个人资料中添加“最喜欢的帖子”按钮,以及“添加到收藏夹”按钮每个帖子,所以问题是如何实现这
我有一个用户模型,允许用户关注其他用户。每个用户也有很多东西: class User has_many :following, :class_name => 'Followings', :fore
我正在使用 Rails 4.1 和 Ruby 2.1。 一个用户 has_many 辆车,和一辆车 has_many 约会。获取所有用户约会的最简单方法是什么? 理想情况下,我想做这样的事情:user
我想为 has_many/has_many 关系定义一个工厂(我想我做对了)但是我不知道如何为这些创建的工厂的每个对象定义属性。 这是主页,这是交易卡片的列表 我们假设下面的主页 View 是针对登录
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我有一个 has many through 关系来定义用户已回答的问题。 如何为用户创建的问题建立关系? 通常你会在用户和问题之间创建一个 has_many 和 belongs_to 关系,但是因为我
例如,在 class Student < ActiveRecord::Base has_many :awards end class Awards < ActiveRecord::Base b
我仍然在尝试如何处理在Ecto中创建/更新has_many, through:关联。我已经重新阅读了José's关于关联以及the docs的帖子,但我仍在努力。 我所拥有的是: 网站/模型/dish
# == Schema Information # # Table name: orders # # id :integer not null, pri
我正在尝试从 EventView.promoter_id = User.id 的用户获取事件,但它无法正常工作。这是我的设置(目前不正确): User has_many :events has_man
我有三门课 TeamMember , Service和ServiceTeamMember 我有 class Service has_many :service_team_members has
我需要列出所有用户及其销售的产品总量及其电子邮件和产品总量, class User :user).group('users.email').sum(:quantity) 关于mysql - 事件记录
我是一名优秀的程序员,十分优秀!