开发者

WARNING: Can't mass-assign these protected attributes: id (ar-extensions)

开发者 https://www.devze.com 2023-02-06 18:30 出处:网络
I\'m using Rails 2.3.5 and AR-extensions 0.9.3 I\'m trying to bulk insert from one table to another table located on a different server / database.I don\'t want anything overwritten though.Just a sim

I'm using Rails 2.3.5 and AR-extensions 0.9.3

I'm trying to bulk insert from one table to another table located on a different server / database. I don't want anything overwritten though. Just a simple insert at the end of the new table is good enough.

I noticed that I get this warning message: WARNING: Can't mass-assign these protected attributes: id

My former entries are being overwritten.. so how do I work around this?

Thanks!

Edit: Figured it out. L开发者_C百科ooks like all I have to is define an array of attributes I want (Excluding id) and feed that into the import function.

Update:

tableA_items = TableA.find(:all)

TableB.establish_connection("other_server")
TableB.import tableA_items


This bug existed in ar-extensions (up to 0.9.5 in which it was fixed) and activerecord-import (up to 0.2.7 in which it was fixed).

ar-extensions is used for Rails 2.x. activerecord-import should be used for Rails 3.x. They support the same APIs.


You could set the id column to nil on the imported items before running the import to avoid the mass_assignment problem:

tableA_items.each {|item| item.id=nil}

Note: It looks like there's a new version of this gem you might want to look at: https://github.com/zdennis/activerecord-import


I still see this same error when using activerecord-import 0.2.7 + Rails 3.0.7, but when importing data from an external XML file. Here's the whole thing (as a Rails migration; I wasn't sure how else to run it):

require 'open-uri'

artists = Array.new
Artist.establish_connection("http://localhost:3000")

begin
  open("*some-url*") do | artists_file |
    artists_file.each do | line |
      if line =~ /<artist id="([\w_]*)" name="(.*)"[ <]/
        puts $1, $2

        if line =~ / sort="(.*)"/
          puts $1
        end

        begin
          artist = Artist.new(:id => $1, :name => $2)
          artists << artist
        rescue
          puts "Couldn't add " + $1 + ": " + $!
        end
      end
    end

    Artist.import artists, :validate => true
  end
rescue
  puts "Couldn't open the artists file."
end

EDIT: nevermind; the problem is that I AM explicitly trying to set the ID value. D'oh!

0

精彩评论

暂无评论...
验证码 换一张
取 消