Rails 6:将两个多对多对象与中间表中的属性相关联

问题描述

因此,我正在开发项目软件,并且具有模型Project和Type,它们之间的关系是很多对很多。

class Project < ApplicationRecord
  has_many :project_types
  has_many :types,through: :project_types
end
class Type < ApplicationRecord
  has_many :project_types
  has_many :projects,through: :project_types
end
class ProjectType < ApplicationRecord
  belongs_to :project
  belongs_to :type
end

我发现的信息说,我可以使用此代码将这两个对象关联起来。

project = Project.new(...)
type = Type.new(...)
project.types << type
project.save

但是,我的项目和类型之间的中间表project_types有一个日期,所以问题是:如何在代码添加该日期?所以我可以跳过这种方式

ProjectType.new(project_id: project.id,type_id: type.id,date: Date.new(...) )

[EDIT]我要添加的数据,是从具有旧项目,类型和日期的excel中获取的,因此该数据用于date attr

我的母语是西班牙语,很抱歉,如果我的英语不是最好的...谢谢您的帮助

解决方法

project_types保留什么日期?

根据数据,您可能有两种选择。

如果创建日期为@at,则始终可以将created_at作为时间戳添加到ProjectType模型中。这应该会自动更新,您将可以轻松地从时间戳中提取日期。

如果从“项目/类型”模型中选择日期,则可以在ProjecType模型中使用回调来填充日期属性。

class ProjectType < ApplicationRecord
  belongs_to :project
  belongs_to :type

  before_save :update_date

  private
  def update_date
    self.date = project.date # similarly you can pick it from `type` model
  end
end

或者您也可以像以前一样创建保存它,但是保存project_type而不是在project中输入类型,并接受nested_attributes作为项目类型中的类型

class ProjectType < ApplicationRecord
  belongs_to :type

  accepts_nested_attributes_for :type
end

project = Project.new(...)
type_attributes = params[:type] # lets say you're sending type attributes inside `type`
project.project_types << ProjectType.new(type_attributes: type_attributes,date: Date.new(...))
project.save