gpt4 book ai didi

sql - 在同一字段上具有多个条件的 Rails 查询

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:57 25 4
gpt4 key购买 nike

我有两个模型,RecipesSkills。在这种情况下,技能是一种 cooking 技术,如烘烤、煎炸等。因此每个食谱都有一组特定的相关技能。

我想像这样搜索所有食谱:

  1. 查找使用任何给定技能集的所有食谱(例如,Baking OR Frying OR both)
    编辑:这不应返回需要不在搜索查询中的技能的食谱 - 例如如果我搜索技能 [1, 2],我不想要使用技能 [1, 2, 4] 或任何其他超集的食谱。

  2. 如果您在搜索中添加新技能,则仅返回额外的食谱(例如,如果您将 Boiling 添加到之前的 Baking 查询或 油炸,你现在能做出多少种新菜谱?)

我目前在 Rails 中使用普通的旧 Ruby 方法进行此操作:

class Recipe < ActiveRecord::Base
has_many :practices
has_many :skills, through: :practices

def self.find_recipes_that_require_any_of_these_skills(*known_skill_ids)
self.select do |recipe|
recipe.skill_ids.all? do |skill_id|
known_skill_ids.include?(skill_id)
end
end
end

# calls the above method twice, once with the new skill and once without
# and subtracts one result from the other
def self.find_newly_unlocked_recipes(*prior_skill_ids, new_skill_id)
self.find_recipes_that_require_any_of_these_skills(*(prior_skill_ids + [new_skill_id])) - self.find_recipes_that_require_any_of_these_skills(*prior_skill_ids)
end
end

在 Rails 控制台中:Recipe.find_recipes_that_require_any_of_these_skills(1,4)
返回技能 1、技能 4 或技能 1 和 4 的所有 Recipe 对象。

但这效率很低,因为它会为我数据库中的每个菜谱生成一个 SQL 查询。

如何以 ActiveRecord/SQL 方式编写这些查询?

最佳答案

def self.find_recipes_that_require_any_of_these_skills(*known_skill_ids)
self.includes(:skills).where(skills: { id: known_skill_ids })
end

关于sql - 在同一字段上具有多个条件的 Rails 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22673106/

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