带有相同名称的列的连接表上的Rails“.pluck”返回一个值,然后返回nil

时间:2014-09-24 16:18:19

标签: sql ruby-on-rails ruby

Experiment has_many :features 
Feature belongs_to :experiment

Experiment.where("experiments.id=1")
    .joins(:features)
    .pluck("features.id", "experiments.id")

我希望这会返回每个功能的ID和实验的ID。

[
    [1, 1],
    [2, 1],
    [3, 1],
    # ....
]

相反,这将返回实验的ID,然后返回nil

[
    [1, nil],
    [1, nil],
    [1, nil],
    # ....
]

这在三个方面很奇怪:

  • 即使它是一个内部联接,只返回一个实验,我可以从功能中提取列(features.name)
  • 在重复列名之前一切正常。
  • 首先报告最后一个弹出列,就好像第一列被覆盖一样。切换拔除顺序会切换返回的值。

这似乎是一个错误,但也许我做错了什么。有什么提示吗?

SQL输出:

SELECT features.id, experiments.id FROM "experiments" INNER JOIN "features" ON "features"."experiment_id" = "experiments"."id" WHERE (experiments.id=1)

请注意。这是一个与查询类似的简化问题:

Experiment.where("experiments.id=1")
    .joins(feature: { child2: { :child3 } })
    .pluck("feature.id, child3.id")

2 个答案:

答案 0 :(得分:8)

这有点棘手。由于存在INNER JOIN,因此查询在此实例中仅生成一个id。实际上你可以反过来形成查询:

Feature.joins(:experiment)
       .where(features: { experiment_id: 1 })
       .pluck(:id, :experiment_id)

或者:

Feature.joins(:experiment)
       .where(experiments: { id: 1 })
       .pluck(:id, :experiment_id)

答案 1 :(得分:3)

发布到rails github后,我发现我的特定问题已在最新的rails版本(4.1.6)中得到解决。

https://github.com/rails/rails/issues/17049