has_many 在关联用户和项目时通过关联错误

Posted

技术标签:

【中文标题】has_many 在关联用户和项目时通过关联错误【英文标题】:has_many through association error while relating users and projects 【发布时间】:2018-12-20 12:57:05 【问题描述】:

我使用 has_many :through 关联两个模型即用户和项目之间的多对多关系,但它似乎有一些错误,因为在多对一关系中运行良好的查询是抛出错误。有人可以检查一下吗!架构文件如下:

    ActiveRecord::Schema.define(version: 2018_12_19_170114) do

  create_table "project_users", force: :cascade do |t|
    t.integer "user_id"
    t.integer "project_id"
    t.index ["project_id"], name: "index_project_users_on_project_id"
    t.index ["user_id"], name: "index_project_users_on_user_id"
  end

  create_table "projects", force: :cascade do |t|
    t.text "content"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "picture"
    t.string "title"
    t.index ["user_id"], name: "index_projects_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.integer "enroll"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.boolean "admin", default: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end

end

user.rb 文件包含代码:

类用户

The project.rb file has the code:

    class Project < ApplicationRecord
      has_many :project_users
      has_many :users, :through => :project_users

project_user.rb 文件有代码:

class ProjectUser < ApplicationRecord
    belongs_to :project, foreign_key: true
    belongs_to :user, foreign_key: true
end
class StaticPagesController < ApplicationController
  def home
    if logged_in?
      @project = current_user.projects.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end

错误是代码抛出的:

<% if @user.projects.any? %>
    <h3>Projects (<%= @user.projects.count() %>)</h3>

错误是:

 SQLite3::SQLException: no such column: project_users.true: SELECT  1 AS one FROM "projects" INNER JOIN "project_users" ON "projects"."id" = "project_users"."true" WHERE "project_users"."user_id" = ? LIMIT ?

【问题讨论】:

编辑您的问题以添加模型的相关部分、引发错误的代码以及(当然)确切的错误消息。 它会抛出什么错误?这是非常基本的调试信息。 Remove foreign_key: true 外键是一个非常规外键的名称,在您的关联中不是这种情况 【参考方案1】:

这是一个措辞糟糕的问题,正如 cmets 所建议的,请包含错误消息,否则无法调试。

一目了然,我可以在您的架构中看到以下问题:

    表以复数形式命名,例如project_users 外键是单数形式,例如user_id 使用t.references :user 帮助程序而不是t.integer :user_id。然后,您可以传递 index: true, foreign_key: true 选项来设置索引和外键。

【讨论】:

架构包含的正是这一点。奇怪的是,它还包括project_user(不是复数形式)版本的表格。然而,HABM 表的 rails 约定将是 projects_users(均为复数),表示关系是单方面的 在添加 ProjectUser 表时检查迁移。它应该创建一个名为project_users 而不是project_user 的表。您可以在错误消息中看到 rails 正在寻找复数形式。 我已回滚迁移并添加了新迁移,已使用当前架构文件更新了问题。但它仍然抛出错误。 从 ProjectUser 类中删除 foreign_key: true 选项。这是您迁移中的一个选项,而不是模型。

以上是关于has_many 在关联用户和项目时通过关联错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rails 5中删除模型时删除模型的所有关联

Rails 4找不到关联has_many,通过:关系错误

如何通过关联在 has_many 中使用回调?

如何通过 has_many 关联在 FactoryBot 中设置工厂

在 has_many 关联中添加数据

Has_Many 通过关联和嵌套属性