按外键值排序

时间:2015-07-22 10:46:12

标签: sql ruby-on-rails

我有2个表:项目和需求。每个需求都属于一个项目。我希望能够通过项目的名称来命令。

我尝试了Demand.joins(:project).order(:name)但我有这个错误:

SQLite3::SQLException: no such column: demands.name: SELECT "demands".* FROM "demands" INNER JOIN "projects" ON "projects"."id" = "demands"."project_id" ORDER BY "demands"."name" ASC

这是我的架构:

ActiveRecord::Schema.define(version: 20150721144552) do
 create_table "demands", force: :cascade do |t|
  t.string   "title"
  t.string   "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
  t.integer  "project_id"
  t.integer  "skill_id"
  t.integer  "user_id"
 end

 add_index "demands", ["project_id"], name: "index_demands_on_project_id"

 create_table "projects", force: :cascade do |t|
  t.string   "name"
  t.string   "image"
  t.string   "description"
  t.datetime "created_at",  null: false
  t.datetime "updated_at",  null: false
 end
end

2 个答案:

答案 0 :(得分:3)

尝试

@demand.joins(:project).order("projects.name")

order的参数是一个db字段。如果涉及多个表(因为在连接中),您应该始终指定表。当你没有指定它时,你冒着rails生成的sql在错误的表中查找该字段的风险,就像这里发生的那样。

答案 1 :(得分:0)

您编写它的方式总是尝试在第一个表上执行它,即在这种情况下需要。每当包含多个表并且您想要在其他表上执行查询时,您应该使用表名引用它。 在这个例子中,它将是:

@demand.joins(:project).order("projects.name")

例如,如果您想要第二张桌子上的条件

@demand.joins(:project).where("projects.name = ?","My Project")