2012-09-16 2 views
0

문제는 내가이 오류를 얻을 수 있습니다 :기계화 대량 할당 오류에 가입 테이블

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: amenity_id 

나는이 코드를 실행하면

task import_amenities: :environment do 

    agent = Mechanize.new 

    Kindergarten.find_all_by_public(false).each do |k| 
    p = agent.get(k.uri) 
    amenities = p.search("td td tr:nth-child(11) td:nth-child(2)").text.split(/(;|,) */) 
    amenities.each do |a| 
     am = Amenity.find_or_create_by_name!("#{a}") 
     k.update_attributes(amenity_id: am.id) 
    end 
    end 
end 

유치원과 편의 시설이 HABTM 관계를 통해 연결되어 및 다음과 같이 정의된다 :

kindergarten.rb

class Kindergarten < ActiveRecord::Base 
    attr_accessible :location, :name, :public, :uri, :address, :contact, 
        :phone, :url, :email, :description, 
        :password, :password_confirmation, :amenity_ids 
    has_and_belongs_to_many :amenities 
end 
여기 amenity.rb

class Amenity < ActiveRecord::Base 
    attr_accessible :name, :kindergarten_ids 
    has_and_belongs_to_many :kindergartens 
end 

조인 테이블에 대한 마이그레이션입니다 :

class CreateKindergartensAmenitiesJoinTable < ActiveRecord::Migration 
    def up 

    create_table :kindergartens_amenities, :id => false do |t| 
     t.integer :kindergarten_id 
     t.integer :amenity_id 
    end 
    end 
end 

오류는 레이크 작업에서이 라인으로 인해 발생 :

k.update_attributes(amenity_id: am.id) 

모든 것 같습니다 질량 할당에 도달 할 때까지 콘솔에서 잘 작동합니다. 그리고 나는 HABTM 이전에는 한번도 사용 해본 적이 없기 때문에 내가 여기있는 것을 정말로 엉망으로 만들고 있다고 생각합니다.

의견이 있으십니까?

답변

1

어젯밤에이 버그로 잠을 잘 수가 없지만 결국 해결책을 찾았습니다.

코드에 몇 가지 문제가 있습니다. 일단 파기를 시작하고 수동으로 db에 데이터를 추가하면 처음에는 조인 테이블 이름이 잘못 지정되었습니다. 이 문제를 해결하려면

class RenameKindergartensAmenitiesTable < ActiveRecord::Migration 
    def up 
    rename_table :kindergartens_amenities, :amenities_kindergartens 
    end 
end 

분명히 habtm 연관은 제목에 알파벳 순으로 붙여야합니다. source

두 번째 문제는

k.amenity_id = am.id 

기존의 각 시설에 대한 amenity_id/kindergarten_id을 추가 할 것으로 가정한다는 것이다. 실제로 k.amenity_id는 아무 것도 의미하지 않습니다 (특히 많은 ID의 경우). 난 아무데도

attr_accessible 수정하지 않은

amenities.each do |a| 
    am = Amenity.find_or_create_by_name!("#{a}") 
    k.update_attributes(amenity_ids: k.amenity_ids.push(am.id)) 
end 

: 일한 해결책은 이것이다