10

Is there a way to set col as dynamic or convert it in some way to a valid attribute? It is currently throwing the error: undefined method `col=' for #...

def copy_stock_data_from_sandbox(cntrlr)
  source_table = cntrlr.singularize.classify.constantize
  dest_table = source_table.new
  source_table.column_names.each do |col|
    dest_table.col = xyz    # <------ This is the line in question
  end
  dest_table.save
end

Also, not sure if the title is accurate, please suggest if 'dynamic attribute' is the wrong term for this situation. Thanks

3 Answers 3

16

I believe that you're looking for the following:

dest_table.send(:"#{col}=", xyz)
13

You can try

dest_table.write_attribute(col, xyz)

OR

dest_table[col] = xyz

OR

dest_table.send("#{col}=", xyz)
1
  • 1
    write_attribute is a private method Commented Aug 8, 2017 at 11:25
0

Perhaps a more idiomatic Rails solution would be to use

assign_attributes or attributes=(which is an alias of assign_attributes).

attrs = User.column_names.each_with_object({}) do |col, hash|
  hash[col] = xyz
end

dest_table.assign_attributes attrs

Also, related question:

Rails update_attributes without save?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.