ruby-on-rails 从轨道中的另一个对象创建对象

xzv2uavs  于 2023-01-10  发布在  Ruby
关注(0)|答案(2)|浏览(143)

我想使用一些已有的记录在我的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-model的一些数据集,我想稍微修改一下,然后保存为新的,但是我得到了错误消息:

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: ...

我很感激每一个提示,或者任何其他解决这个问题的方法。我无法想象,这是如此困难。我已经有很多问题,甚至改变数据集。许多方法,如删除不工作,但我终于找不到一种方法来解决这个问题。

k0pti3hp

k0pti3hp1#

您不能传递关系或其他示例,而不是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
8ulbf1ek

8ulbf1ek2#

您正在向create传递一个对象,而它应该是一个散列(但是,嘿,这正是error所说的,不是吗?))
因此,要获得您所需要的,您可以使用attributes方法:

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

相关问题