【问题标题】:Rails extract values with join associationsRails 使用连接关联提取值
【发布时间】:2018-02-19 01:28:34
【问题描述】:

我在superherosuperpower 两个模型之间有一个rails 连接表。现在我有 3 个不同的 superpower id,我想要所有的 superheroes,其中包含所有选定的 superpowers

为此,我正在尝试执行以下操作:

matches = Superhero.all
matches = matches.joins(:superpowers).where('superpowers.id = ?', 17).where('superpowers.id = ?', 12).where('superpowers.id = ?', 6)

但这给了我一个空对象,即使我有 superheroes,它在我的联接表中有所有给定的 superpowers

上面生成的查询是:

SELECT "superheroes".* FROM "superheroes" INNER JOIN "superheroes_superpowers" ON "superheroes_superpowers"."superhero_id" = "superheroes"."id" INNER JOIN "superpowers" ON "superpowers"."id" = "superheroes_superpowers"."superpower_id" WHERE (superpowers.id = 17) AND (superpowers.id = 17) AND (superpowers.id = 12) AND (superpowers.id = 6)

奇怪的是,它尝试检查 id 为 17 的 superpower 两次(但它不应该影响我认为的结果)并且查询的其余部分似乎是正确的。

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-4 join activerecord


    【解决方案1】:

    尝试使用 in 子句

    superpowers_ids = [17,12,6]
    matches = Superhero.all
    matches = matches.joins(:superpowers).where('superpowers.id in (?)', superpowers_ids)
    

    【讨论】:

    • 应该是一样的..我使用绑定认为你需要一些特殊的绑定..
    • 是的,它有效!我在这样做时犯了一个错误。唯一的问题是它多次返回相同的记录
    • @awefwa 我认为您可以将其附加到 .uniq 以获取单个实例
    【解决方案2】:
    Superhero.joins(:superpowers).where(superpowers:  { id: [17,12,6] } )
    

    这给出了以下 SQL 查询(为便于阅读而格式化):

    SELECT "superheros".* 
    FROM "superheros" 
    INNER JOIN "superhero_superpowers" ON "superhero_superpowers"."superhero_id" = "superheros"."id" 
    INNER JOIN "superpowers" ON "superpowers"."id" = "superhero_superpowers"."superpower_id" 
    WHERE "superpowers"."id" IN (17, 12, 6)
    

    【讨论】:

    • 其实这给了我一个错误PG::UndefinedColumn: ERROR: column superheroes.superpower_id does not exist
    • 你说得对,应该是Superhero.joins(:superpowers).where(superpowers: { id: [17,12,6] } )
    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 2015-06-05
    • 2011-03-21
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多