【问题标题】:active record query conflict between :joins and :includes:joins 和 :includes 之间的活动记录查询冲突
【发布时间】:2011-03-22 04:23:00
【问题描述】:

任何人都可以为下面的查询建议一个简单的解决方法吗?

Workout.all(:joins => [:person, :schedule], 
        :conditions => ["schedule.id = ? AND people.gym_id = ?", schedule.id, gym.id ], 
        :order => "time DESC",
        :include => [:person]),

错误信息说 Mysql::Error: Not unique table/alias: 'people': 然后是一个很长的 sql 查询

当我从 :include 选项中删除 :person 时,代码可以正常工作。但是,然后我遇到了“n+1 个查询”问题:当我显示锻炼时,它会为每个人生成一个单独的查询。

我假设连接中的“人”表在生成的 SQL 中包含选项冲突。有没有办法使用查找选项为具有活动记录的表起别名?或者我是否需要为 :joins 选项使用 sql 片段,以便我可以使用 AS 为表起别名?

我还没有将这个应用升级到3.0,所以我不能使用“Class.joins().where()”语法。

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:

    您可以从联接中删除 :person 并将其保留在包含中,您可以在 :select 选项中从人员表中添加字段,例如

    Workout.all(:joins => [:schedule], 
        :conditions => ["schedule.id = ? AND people.gym_id = ?", schedule.id, gym.id ], 
        :order => "time DESC",
        :select => "workouts.*,people.*"
        :include => [:person])
    

    【讨论】:

    • 谢谢,这成功了,虽然我很难理解为什么。将 person 放入 :include 会生成一个左外连接,它应该返回所有锻炼,而不仅仅是那些与 person.gym_id 条件匹配的人,对吧?但它确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多