在 rails 中,模型的实例不会显示在我的表中。当控制台显示"COMMIT"和"=>true"时会发生什么?



我对RubyonRails还很陌生,遇到了一些问题。我已经查过了:这个关于克隆模型的stackoverflow问题

我正在为一个看起来像这样的模型创建一种新方法:

def copy(new_period)
@copy = self.clone
@copy.report_id = Report.maximum(:report_id).next
@copy.period_id = new_period
@copy.save
end

我正在尝试创建一个新的报表实例,该实例可以移动到下一年(期间(。当我在irb中运行此方法时,我得到:

irb(主(:003:0>c=r.copy(5(

(1.8ms(选择MAX("reports"."report_id"(作为MAX_id FROM;报告";

(0.8ms(开始

(1.0ms(更新";报告";SET";period_id"=5其中";报告"report_id"=438

(1.1ms(COMMIT

=>真实

当我在pgAdmin中查看时,新报告不在那里。有人能向我解释一下当控制台显示";提交";以及"=>真的";?这不意味着它已经保存到数据库中吗?

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

来自ActiveRecord::Core#clone:的文档

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

然而,ActiveRecord::Core#dup产生了一个新的记录:

重复的对象没有分配id,将被视为新记录。请注意,这是一个"浅层"复制,因为它只复制对象的属性,而不是其关联。"深度"拷贝的范围是特定于应用程序的,因此留给应用程序根据其需要来实现。dup方法不保留时间戳(创建|更新(_(在|on(。


关于你的附带问题:

  • CCD_ 6和CCD_ 7用于启动和结束SQL中的事务
  • truer.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

因为要获得副本,请使用clone(或dup for rails 3.1(方法:

# rails < 3.1
new_record = old_record.clone
#rails >= 3.1
new_record = old_record.dup

所以,目前正在发生的事情是,你正在克隆,而不是制作新的记录,只是每次更新前一个记录。如果你仔细阅读你的查询:

(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

它首先选择记录,然后只是更新它,而不是创建新记录(INSERT(查询。

希望这能有所帮助。

最新更新