【问题标题】:Rails Active Record Query - display projects to project creators/membersRails Active Record Query - 向项目创建者/成员显示项目
【发布时间】:2020-10-21 14:00:39
【问题描述】:

我有三个表:User through devise、ProjectProjectUser

User 可以是许多ProjectProjectUser 的表的一部分。如何查询Project 的索引操作显示当前用户已创建并属于其中的项目?

假设我有三个项目和两个团队成员:

  • 用户 1 已创建并且是项目 A 的成员
  • 用户 2 已创建并且是项目 B 的成员
  • 用户 2 已创建并且是项目 C 的成员
  • 用户 1 是项目 C 的成员

当我以以下身份登录时:

  • 用户 1,我应该可以同时看到项目 A 和 C。
  • 用户 2,我应该可以同时看到项目 B 和 C。

这是我的模型、控制器和架构:

projects_controller.rb

@projects = current_user.projects.joins(:project_users).distinct.order("created_at DESC")

项目.rb

class Project < ApplicationRecord
  has_many :project_users
  has_many :users, through: :project_users
end

user.rb

class User < ApplicationRecord
  has_many :project_users
  has_many :projects, through: :project_users
end

project_user.rb

class ProjectUser < ApplicationRecord
  belongs_to :user
  belongs_to :project
end

schema.rb

create_table "project_users", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.bigint "project_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["project_id"], name: "index_project_users_on_project_id"
    t.index ["user_id"], name: "index_project_users_on_user_id"
end

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord rails-activerecord


    【解决方案1】:

    我认为这应该适合你

    @projects = current_user.projects.distinct.order("created_at DESC")
    

    你不需要:joins(:project_users)

    有关 has_many :through 协会的更多信息: https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

    【讨论】:

    • 谢谢,托尼。这仅显示当前用户创建的项目,而不显示当前用户所属的项目。
    • 您需要在 project_users 上创建成员作为新记录。如果您不知道谁是项目的创建者或管理员,(确保在项目模型中没有道具 user_id。您不需要。)确保这是正确的。您在问题中添加的代码没问题。并且您应该能够调用 current_user.projects 并显示 ProjectUser 模型中出现的所有记录。
    • 如果你不想,请在评论中发布 git repo,我看看! :)
    【解决方案2】:

    这是适用于我的情况的查询

    Project.joins(:project_users).where(project_users: {user_id: current_user.id}

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多