복붙노트

[RUBY-ON-RAILS] 새로운 데이터는 포스트 그레스에 레일 배열 열을 지속하지

RUBY-ON-RAILS

새로운 데이터는 포스트 그레스에 레일 배열 열을 지속하지

나는 형 텍스트의 친구 열이있는 사용자 모델을 가지고있다. 이 마이그레이션은 포스트 그레스와 배열 기능을 사용하려면 실행되었다 :

add_column    :users, :friends, :text, array: true

사용자 모델은이 방법이 있습니다 :

def add_friend(target)
  #target would be a value like "1234"
  self.friends = [] if self.friends == nil
  update_attributes friends: self.friends.push(target)
end

내가 #add_friend를 호출 한 후 user.reload을 추가 할 때까지 다음 사양을 전달합니다

it "adds a friend to the list of friends" do
  user = create(:user, friends: ["123","456"])
  stranger = create(:user, uid: "789")
  user.add_friend(stranger.uid)
  user.reload #turns the spec red
  user.friends.should include("789")
  user.friends.should include("123")
end

이뿐만 아니라 개발에 발생합니다. 모델 인스턴스를 업데이트하고 배열의 새로운 UID를 가지고 있지만, 다시로드하거나 다른 행동에 사용자를 다시로드하면, 그것은 add_friend 메소드가 호출되기 전에 사용했던갑니다된다.

레일을 사용 4.0.0.rc2 및 페이지 0.15.1

이것은 무엇을 할 수 있을까?

해결법

  1. ==============================

    1.나는 물론, 기본 배열 참조 할 때 변경되지 않습니다, 때문에 액티브 친구 어레이가 변경된 것을 알아 차리지되지 않는다고 생각 :

    나는 물론, 기본 배열 참조 할 때 변경되지 않습니다, 때문에 액티브 친구 어레이가 변경된 것을 알아 차리지되지 않는다고 생각 :

    self.friends.push(target)
    

    즉, 배열의 내용을 변경하지만 배열 자체는 여전히 같은 배열이됩니다. 나는이 문제가 Rails3에서 postgres_ext 보석과 함께 작물이 문제를 주어진 것을 알고있다 :

    나는 Rails4이 같은 방식으로 행동하는 기대.

    이 솔루션은 오히려 현재 위치에서 배열을 수정하는 것보다 새로운 배열을 생성하는 것입니다 :

    update_attributes friends: self.friends + [ target ]
    

    하나 당신이 좋아하는 중 기존 배열 사용에 요소를 추가하는 동안 새로운 배열을 생성 할 수있는 여러가지 방법이 있습니다.

  2. ==============================

    2.문제가 자리에 배열을 수정 추진의 사용,있을 것 같습니다.

    문제가 자리에 배열을 수정 추진의 사용,있을 것 같습니다.

    나는 기압보다 기본 소스를 찾을 수 있지만,이 게시물은 말합니다 :

  3. ==============================

    3.당신은 PostgreSQL의 배열 형식을 사용하려면, 당신은 그 형식을 준수해야합니다. PostgreSQL의 문서의 입력 형식은

    당신은 PostgreSQL의 배열 형식을 사용하려면, 당신은 그 형식을 준수해야합니다. PostgreSQL의 문서의 입력 형식은

    '{10000, 10000, 10000, 10000}'
    

    어떤 friends.to_s가 반환됩니다 것이 아니다. 루비 :

    [1,2,3].to_s => "[1,2,3]"
    

    그 대신 중괄호의 브라켓입니다. 당신은 변환 스스로해야 할 것이다.

    그러나 나는 차라리 (직렬화 참조) 액티브의 직렬화에 의존하는 것입니다. 데이터베이스는 그 데이터베이스에 유출 도메인 모델의 값이 실제로 배열 인 것을 알 필요가 없습니다. 하자 레일은 일하고 캡슐화 정보를한다; 이미 직렬화 / 값을 역 직렬화 방법을 알고 있습니다.

    참고 :이 응답은 레일 3에 적용하지 4. 나는 그것이 미래에 누군가가 도움이 경우에 여기에 떠날거야.

  4. from https://stackoverflow.com/questions/17283854/new-data-not-persisting-to-rails-array-column-on-postgres by cc-by-sa and MIT license