将对象id保存到嵌套的has_many到模型

时间:2014-10-11 15:48:09

标签: ruby-on-rails ruby activerecord relationship

我有3个模特

class User < ActiveRecord::Base
  has_many :projects
  has_many :project_files, through: :projects

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :project_files

class ProjectFile < ActiveRecord::Base
  belongs_to :project

当我使用以下内容创建project_file时:

@project = current_user.projects.find(params[:id])
@project.project_files.new

它不会将用户ID保存到project_file记录中,但会保存项目ID。

我希望能够通过调用@project_file.user来访问用户并返回ID

1 个答案:

答案 0 :(得分:0)

在查看了您的gist之后,您似乎需要稍微更改一下您的关联,以便让您的工作正常进行:

class User < ActiveRecord::Base
  has_many :project_files
  has_many :projects, through: :project_files

class Project < ActiveRecord::Base
  has_many :project_files
  has_many :users, through: :project_files

class ProjectFile < ActiveRecord::Base
  belongs_to :project
  belongs_to :user

此外,为user_id添加Project列是没有意义的,除非你打算将它用于某种不同的目的,而不仅仅是关联,我的意思是,如果{我不需要它项目和project_files中的{1}}将是相同的。好吧,现在,您可以使用user_id

使用current_user执行此操作
project_files

或:

@project = Project.find(params[:id]) # project to be associated
@project_file = current_user.project_files.build(project: @project)

然后:

@project_file = current_user.project_files.build(project_id: params[:id])

@project_file.save # save the association between user and project! 中的user_id应该保存并立即提交给db。但是,它不会将project_files保存在user_id中,因为在两个不同的表中确实没有projects(除非您在评论/问题中指出一个)。