【问题标题】:ActiveRecord query with includes and conditions not giving expected SQL具有包含和条件的 ActiveRecord 查询未给出预期的 SQL
【发布时间】:2013-04-04 21:15:53
【问题描述】:

好的,这就是我遇到的问题。我有一个模型,它在直通表中的条件上设置了两个关系。

has_one :link_resource, through: :resource_contexts, source: :resource, conditions: ['resource_contexts.question_id = ? ', -1]
has_many :sample_plans, through: :resource_contexts, source: :resource, conditions: ['resource_contexts.question_id = ? ', -2]

然后,在我的控制器中,我尝试使用

@funder_templates = FunderTemplate.find(:all, include: [:sample_plans, :link_resource], conditions: {active: true})

但是由于某种原因,sql出来是这样的

ResourceContext Load (0.2ms)  SELECT `resource_contexts`.* FROM `resource_contexts` WHERE (`resource_contexts`.funder_template_id IN (2,3,4,5,6,7,8,9,10,11,12,13,14,20,21,22,23,24,25,26,27,30,40) AND (resource_contexts.question_id = -2 ))

请注意,它只查找第一个关系的条件,而不是第二个。我不知道我正在做的事情是否太复杂以至于 ActiveRecord 无法处理,或者我只是写错了。任何帮助将不胜感激。

Rails 3.0.20

Ruby 1.9.2

编辑:澄清一下,真正搞砸的部分是@funder_templates.sample_plans 是正确的,但@funder_templates.link_resource 也是示例计划!没有包含,关系工作正常,只是没有优化。

【问题讨论】:

  • 你写include: [:sample_plans, :link_resource] - 这些都是关系。
  • @Mik_Die 这不是我写的吗?
  • 如果你想尝试使用更新的语法...@funder_templates = FunderTemplate.all.includes([:sample_plans, :link_resource]).where(:active => true)
  • @depa 我试过 funder_templates = FunderTemplate.includes([:link_resource, :sample_plans]).where(active: true) 但同样的问题发生了。 funder_templates.sample_plans 和funder_templates.link_resource 都是sample_plans。由于某种原因,它只是没有得到第二个包含关系。
  • 你也有has_many :resource_contexts 行吗?你应该。

标签: sql ruby-on-rails ruby ruby-on-rails-3 rails-activerecord


【解决方案1】:

你试过了吗? @funder_templates = FunderTemplate.where(active: true).includes([:sample_plans, :link_resource])

我觉得应该可以

【讨论】:

  • 您可能没有看到我对 depa 的评论,但我确实尝试了 @funder_templates = FunderTemplate.includes([:link_resource, :sample_plans]).where(active: true)。这产生了相同的结果,当我查看 @funder_templates.link_resource 和 @funder_templates.sample_plans 时,它们都是示例计划。我最终走了一条不同的路线(效率相似),因为我相信这是活动记录中的一个错误。可能在我们在生产中使用的版本 (3.0.20) 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多