希望你今天过得愉快。
所以我有三个模型。 User
、Project
和 TodoList
。一个 User
hasMany Project
和一个项目 hasMany TodoList
s,一个 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
但我想通过关联来做,我希望我的问题有意义
答案 0 :(得分:1)
当您调用 project.todo_lists.new
时,project
的唯一细节是其关联的 todo_list
正在被实例化,并且它会在新实例化的对象中设置 project_id
。 project
不知道 todo_list
如何维护它的 user_id
,因此,它没有设置它。
这样设置后,您的 user_id
中不应同时包含 project_id
和 todo_list
。 todo_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 然后列表中引用的一次)。