2014-01-16 5 views
2

Model에서 Array로 속성을 설정하는 방법을 가르쳐 주시겠습니까?모델에서 속성을 Array로 설정하는 방법은 무엇입니까?

나는 그것을 시도했지만 내가 push, each 같은 배열의 방법을 사용할 때, 나는 undefined method `push' for nil:NilClass

내 마이그레이션 모양이 같은 오류가 발생했습니다 :

class CreateContacts < ActiveRecord::Migration 
    def change 
    create_table :contacts do |t| 
     t.string :name 
     t.string :email 
     t.string :email_confirmation 
     t.integer :city_ids, array: true 
     t.text :description 

     t.timestamps 
    end 
    end 
end 

내가 배열에 속성 city_ids를 설정하려는 .

+0

당신이 체크 한이 하나 http://reefpoints.dockyard.com/ruby/2012/09/18/rails-4-sneak-peek-postgresql-array- support.html –

+0

감사합니다,하지만 여전히 나에게 도움이되지 않습니다. 배열로 설정된 속성에서 배열 메소드를 사용할 수 없습니다. –

답변

1

기본값을 설정해야합니다. 때주의하는 것이

c = City.find(...) 

c.city_ids ||= [] 

c.city_ids.push(...) 
+0

여러 체크 박스에 대해 배열 속성을 사용하고 일부 체크 박스가 있고 체크했을 때, 배열 속성은 값을 추가합니다. 하지만 여전히 "push, first, last"와 같은 배열 메서드를 사용할 수 없습니다. NoMethodError –

3

하나 개 중요한 것은 : 당신이 eyou이 그것을 사용하려고 befor을 그것에게 가치를 부여 할 필요가

t.integer :city_ids, array: true, default: [] 

또는 : 당신이 그것을 값을 제공 할 때까지 그렇지 않으면, 속성은 nil입니다 모델에서 배열 (또는 다른 변경 가능한 값)과 상호 작용합니다. ActiveRecord는 현재 "파괴적"이거나 위치 변경을 추적하지 않습니다. 여기에는 배열 푸싱 (pushing)과 팝업 (poping), DateTime 객체의 진보가 포함됩니다. 예

john = User.create(:first_name => 'John', :last_name => 'Doe', 
    :nicknames => ['Jack', 'Johnny']) 

john = User.first 

john.nicknames += ['Jackie boy'] 
# or 
john.nicknames = john.nicknames.push('Jackie boy') 
# Any time an attribute is set via `=`, ActiveRecord tracks the change 
john.save 

Referrence - link

관련 문제