Rails:嵌套关联设置 user_id

时间:2020-12-19 11:56:26

标签: ruby-on-rails rails-activerecord

希望你今天过得愉快。

所以我有三个模型。 UserProjectTodoList。一个 User hasMany Project 和一个项目 hasMany TodoLists,一个 todolist 因此属于一个 User 和一个 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

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

1 个答案:

答案 0 :(得分:1)

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

这样设置后,您的 user_id 中不应同时包含 project_idtodo_listtodo_lists 表应该只引用 project_id,并且您的模型应该与用户模型相关联,

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

  has_many :todos
end

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

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

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

相关问题