Rails:嵌套关联剂量集user_id

Rails: nested association dosent set user_id

希望你今天过得愉快。

所以我有三个模型。 UserProjectTodoList。 a User hasMany Project and a project hasMany TodoLists, todolist thus belongsTo a User and a Project.

这是模型

User.rb

class User < ApplicationRecord
  has_many :projects
  has_many :todo_lists
end

Project.rb

class Project < ApplicationRecord
  acts_as_tenant :user
  belongs_to :user

  has_many :members, class_name: 'ProjectUser'
  has_many :todo_lists

  validates :name, presence: true
end

TodoList.rb

class TodoList < ApplicationRecord
  belongs_to :user
  belongs_to :project
  has_rich_text :description

  has_many :todos
end

我的问题

当我尝试通过关联创建待办事项列表时,未设置 user_id。例如当我做

u = some user

u.projects.new // => #<Project id: nil, user_id: 1, name: nil, description: nil, created_at: nil, updated_at: nil>

如您所见,user_id 由 rails 设置,这是预期的行为。但是,当我尝试通过 assosiactions 创建一个新的 TodoList 项目时,user_id 没有被设置

u = some user

u.projects.first.todo_lists.new  #<TodoList id: nil, user_id: nil, project_id: 5, name: nil, description: nil, created_at: nil, updated_at: nil>

可以看到,project_id设置成功,但是user_id没有设置。这是 rails 的预期吗?或者我做错了什么?我可以通过像这样手动设置用户来解决这个问题

u = some user
p = u.projects.first
todo_list = p.todo_lists.new name: "complete tasks"
todo_list.user = u
todo_list.save

但我想通过协会来做,我希望我的问题有意义

当您调用 project.todo_lists.new 时,project 唯一的细节是正在实例化其关联的 todo_list,并在新实例化的对象中设置 project_id . project 不知道 todo_list 如何维护它的 user_id,因此,它没有设置它。

根据设置,您的 todo_list 中不应同时包含 user_idproject_idtodo_lists table 应该只引用 project_id,并且您的模型应该与用户模型相关联,

class TodoList < ApplicationRecord
  belongs_to :project
  has_one :user, through: :project
  has_rich_text :description

  has_many :todos
end

并且您的用户模型可以将 TodoList 引用为

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

通过这样设置您的模型,您将删除冗余数据,您的 table 可以更好地规范化,并且数据库中出现不一致数据的可能性较小(例如,属于另一个用户的项目,然后是列表中曾经引用的项目。