Ruby on rails 在rails中,模型的实例不会显示在我的表中。当控制台显示“提交”和“=>true”时会发生什么?

Ruby on rails 在rails中,模型的实例不会显示在我的表中。当控制台显示“提交”和“=>true”时会发生什么?,ruby-on-rails,irb,pgadmin,Ruby On Rails,Irb,Pgadmin,我是RubyonRails的新手,我遇到了一些问题。 我已经退房了: 我正在为模型创建一个新方法,如下所示: def copy(new_period) @copy = self.clone @copy.report_id = Report.maximum(:report_id).next @copy.period_id = new_period @copy.save end 我正在尝试创建一个新的report实例,可以移动到下一年。当我在irb中运行此方法时,我得到: irbmain:003:

我是RubyonRails的新手,我遇到了一些问题。 我已经退房了:

我正在为模型创建一个新方法,如下所示:

def copy(new_period)
@copy = self.clone
@copy.report_id = Report.maximum(:report_id).next
@copy.period_id = new_period
@copy.save
end
我正在尝试创建一个新的report实例,可以移动到下一年。当我在irb中运行此方法时,我得到:

irbmain:003:0>c=r.copy5

1.8ms从报告中选择MAXreports.report\u id作为max\u id

0.8毫秒开始

1.0ms更新报告设置周期\u id=5,其中reports.report\u id=438

1.1ms提交

=>正确


当我查看pgAdmin时,新报告不在那里。有人能给我解释一下当控制台说commit和=>true时发生了什么吗?这不意味着它已保存到数据库中吗?

您正在更新旧模型,因为模型的id仍处于设置状态。您可以看到这一点,因为控制台显示的是更新而不是INSERT语句

从:

与Ruby的克隆方法相同。这是一个“肤浅”的副本。请注意,您的属性未被复制。这意味着修改克隆的属性将修改原始属性,因为它们都指向相同的属性哈希。如果需要属性哈希的副本,请使用dup方法

然而,这将创造一个新的记录:

被复制的对象没有指定id,并被视为新记录。请注意,这是一个“浅”副本,因为它只复制对象的属性,而不复制其关联。“深度”拷贝的范围是特定于应用程序的,因此由应用程序根据需要实现。dup方法不保留在| on |创建的| updated | u时间戳

关于你的次要问题:

BEGIN和COMMIT用于启动和结束SQL中的事务。 true是r.copy的结果,它隐式返回@copy.safe的值,如果模型成功保存,它将返回true。
将此方法设置为,然后尝试:

def copy(new_period)
  @copy = self.dup
  @copy.report_id = Report.maximum(:report_id).next
  @copy.period_id = new_period
  @copy.save
end
因为要获取副本,请使用克隆或dup for rails 3.1方法:

# rails < 3.1
new_record = old_record.clone

#rails >= 3.1
new_record = old_record.dup
它首先选择记录,然后只是更新它,而不是创建新的记录插入查询


希望这能有所帮助。

谢谢您提供的所有信息!这很有帮助,不客气。如果答案有帮助的话,接受并投票是完全正常的,也可以:是的,我想对我得到的两个回答都投票,但上面说我需要15的声誉才能这么做。我一拿到票就回来投票。
(1.8ms) SELECT MAX("reports"."report_id") AS max_id FROM "reports"
(0.8ms) BEGIN
(1.0ms) UPDATE "reports" SET "period_id" = 5 WHERE "reports"."report_id" = 438
(1.1ms) COMMIT