从rails中的另一个对象创建一个对象

时间:2017-02-27 18:36:22

标签: mysql ruby-on-rails ruby activerecord

我想使用一些现有记录在我的mysql数据库中创建一些记录。我正在使用rails 4.2

这是我控制器中的相关代码:

linkconfig_id = 17
new_config = Linkconfigdetail.where(:linkconfig_id => user_params[:linkconfig_id])

new_config.each do |config|
  config[:linkconfig_id] = linkconfig_id
  config[:id] = nil
  config[:created_at] = nil
  config[:updated_at] = nil
end

Linkconfigdetail.create(new_config)

new_config变量包含Linkconfigdetail模型的一些数据集。我想略微更改它们然后将它们保存为新的,但我收到错误消息:

ArgumentError (When assigning attributes, you must pass a hash as an argument.): 

和create-method的行。

我已经查过了。 new_config-array不是nil。在创建(使用inspect)之前看起来像这样:

#<ActiveRecord::Relation [#<Linkconfigdetail id: nil, linkconfig_id: 17, link_id: 1, location: 0, created_at: nil, updated_at: nil>, #<Linkconfigdetail id: nil, linkconfig_id: 17, link_id: 18, location: 1, created_at: nil, updated_at: nil>, #<Linkconfigdetail id: ...

我很欣赏这个问题的每一个提示或任何其他解决方案。我无法想象,这太难了。即使更改数据集,我也遇到了很多问题。像删除这样的许多方法都不起作用,但我终于无法找到解决此问题的方法。

2 个答案:

答案 0 :(得分:4)

您无法传递{H}作为create的关系或其他实例。相反,您可以复制原始文件,创建一个新的实例,但不保留与原始值相同的值(idcreated_atupdated_at属性除外),并在保存之前更改所需的属性它

你可以这样做:

linkconfig_id = 17
configs = Linkconfigdetail.where(:linkconfig_id => user_params[:linkconfig_id])

configs.each do |config|
  new_config = config.deep_dup
  new_config.link_config_id = linkconfig_id

  new_config.save
end

答案 1 :(得分:2)

你正在将一个对象传递给create,而它应该是一个哈希(但是嘿,这正是错误所说的,不是吗?))

为了得到你需要的东西,你可以使用attributes方法:

new_config.each do |config|
  Linkconfigdetail.create(config.attributes)
end