【问题标题】:Ruby on Rails: how to copy objects from one category to anotherRuby on Rails:如何将对象从一个类别复制到另一个类别
【发布时间】:2017-04-21 14:23:31
【问题描述】:

我正在尝试将一些最新的收件人(订阅者)复制到我的时事通讯应用中的新类别。我在 Rails 控制台中运行了以下代码行,但没有将收件人复制到新类别,而是将最新的 10 个收件人移动到新类别。看起来recipient.clone 不起作用。我正在使用 Ruby v2.0.0 和 Rails v3.2.11

recipients = Recipient.where(category_id: 54).order('created_at DESC').take(10)
recipients.each{ |recipient| 
  @recipient_clone = recipient.clone
  @recipient_clone.category_id=63
  @recipient_clone.save
}

更新:

我试过了

recipients.each{ |recipient| 
  recipient.freeze
  @recipient_clone = recipient.dup
  @recipient_clone = @recipient_clone.category_id=63
  @recipient_clone.save
}

但它给出了NoMethodError: private method 'initialize_dup' called 错误。

【问题讨论】:

  • 你试过用recipient.dup代替吗?
  • 是的,但它给出了NoMethodError 错误
  • 正如@Iceman 所说。克隆将保留 id 字段,因此当您保存时,您正在更新现有记录。 dup 更适合您的目的。
  • @Iceman 我在recipient.dup 之前尝试过recipient.freeze,但它引发了相同的NoMethodError

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


【解决方案1】:

这可能不是最干净的方法,但它应该可以工作:)

recipients = Recipient.where(category_id: 54).order('created_at DESC').take(10)
recipients.each{ |recipient| 
  @recipient_clone = Recipient.new(recipient.attributes.except(:id))
  @recipient_clone.category_id=63
  @recipient_clone.save
}

【讨论】:

  • 是的,这应该可以。我们使用了类似的方法Recipient.new(:email => r.email, :first_name => r.first_name ....),因为我们必须排除许多属性并且它有效。
  • 我正在等待,如果我们能更好地解释为什么 recipient.dup 不起作用,否则我会接受你的回答。
  • 您说您使用的是 Rails v3.2.11,对吧?这个问题说你应该使用 Rails 3.2.13 或更高版本。 github.com/airblade/paper_trail/issues/294
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多