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

Chr*_*ner 2 ruby mysql activerecord ruby-on-rails

我想使用一些现有记录在我的 mysql 数据库中创建一些记录。我正在使用导轨 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)
Run Code Online (Sandbox Code Playgroud)

new_config 变量包含 Linkconfigdetail-model 的一些数据集。我想稍微改变它们,然后将它们另存为新的,但我收到错误消息:

ArgumentError (When assigning attributes, you must pass a hash as an argument.): 
Run Code Online (Sandbox Code Playgroud)

和创建方法的行。

我已经检查过了。new_config-array 不为零。在创建之前(使用检查),它看起来像这样:

#<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: ...
Run Code Online (Sandbox Code Playgroud)

我很欣赏每一个提示,或者一般来说这个问题的任何其他解决方案。我无法想象,这太难了。我什至在更改数据集时已经遇到了很多问题。很多方法比如delete都行不通,但是我最终还是找不到解决这个问题的方法。

cef*_*edo 5

您不能传递关系或其他实例,而不是 Hash for create。相反,您可以复制原始实例,创建一个不具有与原始值相同的值(除了id,created_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
Run Code Online (Sandbox Code Playgroud)