【问题标题】:Query an association with an alias查询与别名的关联
【发布时间】:2016-07-05 17:52:21
【问题描述】:

我有一个 users 表和一个 tasks 表,其模型具有以下关联:

class Task < ActiveRecord::Base
  belongs_to :owner, class_name: User
end

我正在尝试构建一个查询来搜索task 的description 及其owner 的名称:

includes(:owner).where("LOWER(tasks.description) LIKE ? OR LOWER(owner.name) LIKE ?", "%#{q.downcase}%", "%#{q.downcase}%")

...但我不知道如何正确查询任务所有者的用户表。代替owner.name,我尝试了users.name、tasks.users.name,可能还有其他一些东西,但都无济于事。我该怎么做?

注意:我不想为此添加宝石。我正在寻找一种原生于 rails 的解决方案。

编辑:

存在于我的 schema.rb 中的外键

add_foreign_key "tasks", "users", :name => "tasks_owner_id_fk", :column => "owner_id", :dependent => :nullify

第二次编辑:

我还需要一个返回 AREL 的解决方案。我可以通过返回一个对象数组来实现它,但是我需要在结果中添加其他查询方法,所以它必须是 AREL。

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    如果您想在视图或查询中调用 owner.name,则需要包含 owner_id 的 foreign_key。

    其次,您应该仍然可以调用用户,但由于它是一个belongs_to,它将是user.name,而不是users.name

    如果您设置了 foreign_key,您可以像以前一样调用 owner.name,它会起作用。

    这应该可以帮助您进行设置:

    http://guides.rubyonrails.org/active_record_migrations.html#foreign-keys

    【讨论】:

    • 外键已经存在 - 见我上面的编辑。至于使用user.name而不是users.name,请注意这是在查询中,引用表名也是如此,而不是activerecord关联方法。
    • 误击保存
    • 试试这个:includes(:owner).where("LOWER(tasks.description) LIKE ? OR LOWER(tasks_owner_id_fk.name) LIKE ?", "%#{q.downcase}%", "%#{q.downcase}%"
    • 错误是什么?因为我在几个模型中使用了外键,我模仿了你的查询,它对我有用。
    • ActiveRecord::StatementInvalid: PG::UndefinedTable: 错误: 缺少表“tasks_owner_id_fk”的 FROM 子句条目 LINE 1: ...E (LOWER(tasks.description) LIKE '%and%'或更低(tasks_owne...
    【解决方案2】:

    挖了一整天,this post帮我解决了,我的解决方法如下:

    joins("LEFT OUTER JOIN users ON users.id = tasks.owner_id").where("LOWER(users.name) LIKE ? OR
           LOWER(tasks.description) LIKE ?",
           "%#{q.downcase}%", "%#{q.downcase}%")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多