Rails:嵌套关联剂量集user_id
Rails: nested association dosent set user_id
希望你今天过得愉快。
所以我有三个模型。 User
、Project
和 TodoList
。 a User
hasMany Project
and a project hasMany TodoList
s, 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_id
和 project_id
。 todo_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 可以更好地规范化,并且数据库中出现不一致数据的可能性较小(例如,属于另一个用户的项目,然后是列表中曾经引用的项目。
希望你今天过得愉快。
所以我有三个模型。 User
、Project
和 TodoList
。 a User
hasMany Project
and a project hasMany TodoList
s, 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_id
和 project_id
。 todo_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 可以更好地规范化,并且数据库中出现不一致数据的可能性较小(例如,属于另一个用户的项目,然后是列表中曾经引用的项目。