将新记录添加到新记录

Posted

技术标签:

【中文标题】将新记录添加到新记录【英文标题】:Add new record to a new record 【发布时间】:2015-01-09 03:20:10 【问题描述】:

我正在使用 Rails 4.1.6 我在创建新记录然后保存它们时遇到问题。以下是模型:

class Function < ActiveRecord::Base
  belongs_to :theater
  has_many :showtimes, dependent: :destroy
  belongs_to :parsed_show

  validates :theater, presence: :true
  validates :date, presence: :true
end

class Theater < ActiveRecord::Base
  has_many :functions, :dependent => :destroy
  validates :name, :presence => :true
  accepts_nested_attributes_for :functions
end

class Showtime < ActiveRecord::Base
  belongs_to :function
  validates :time, presence: true
  validates :function, presence: true
end

showtime = Showtime.new time: Time.current
theater = Theater.first # read a Theater from the database
function = Function.new theater: theater, date: Date.current
function.showtimes << showtime
function.showtimes.count # => 0

为什么没有将放映时间添加到函数的放映时间?我需要稍后保存该函数以及它的放映时间。

【问题讨论】:

【参考方案1】:

您的Function 对象尚未持久化。您需要确保它是持久的(当然这也要求它是有效的),然后才能将内容添加到其放映时间列表中。

尝试保存函数beorehand,如果成功(即function.persisted?true),它应该允许您将&lt;&lt;直接存入function.showtimes,随心所欲。或者,您可以使用Function#create 类方法代替Function#new 类方法,因为前者会自动保留记录。

【讨论】:

【参考方案2】:

您可以使用Function#create

theater = Theater.first # read a Theater from the database
function = Function.new theater: theater, date: Date.current
function.showtimes.create(time: Time.current)

【讨论】:

【参考方案3】:

我忘记检查保存函数是否也保存了剧院,即使 function.showtimes.count 返回 0,放映时间仍然保存到数据库中。

function.showtimes.count 返回:

=> 0

但是 function.showtimes 返回:

=> #<ActiveRecord::Associations::CollectionProxy [#<Showtime id: nil, time: "2015-01-09 04:46:50", function_id: nil>]>

【讨论】:

以上是关于将新记录添加到新记录的主要内容,如果未能解决你的问题,请参考以下文章

将新记录添加到数据库时如何播放声音

将记录添加到 numpy 记录数组

在将记录添加到数据库之前检查记录是不是存在

循环将新记录添加到打字稿中的数组[关闭]

如何在不覆盖现有记录的情况下将新行添加到数据表

将记录添加到表中时记录的日期/时间戳? [复制]