0

멀티 레일 이메일 연결 등을 포함하는 iphone contact과 일치하도록 레일스 모델 스키마를 만들었습니다. 전체 주소록 배열을 가져 오는 컨트롤러 작업이 있습니다. 여러 전자 메일 개체 포함). 상당히 효율적으로 실행하려면이 필요합니다. 그래서 배치 가져 오기 activerecord-import 찾고있었습니다. 그러나 각 컨택의 범위 내에서 전자 메일의 고유성을 확인하여 일괄 처리를 가져올 때마다 중복을 계속 추가하지 않아야합니다. 수작업으로 직접 update_attributes의 자체 버전을 구축해야합니까, 아니면 이와 같은 많은 레코드의 유효성을 검사/업데이트 할 때 권장 할만한 기존 솔루션이 있습니까?iphone 주소록을 레일스와 동기화하기

연락 모델

 
class Contact > ActiveRecord::Base 
    has_many :addresses 
    has_many :emails 
    has_many :websites 
    accepts_nested_attributes_for :addresses, :emails, :websites 
    attr_accessible :prefix, :first_name, :middle_name, :last_name, :suffix, 
        :nickname, :organization, :job_title, :department, :birthday, 
        :addresses_attributes, :emails_attributes, :websites_attributes     
end 

이메일 모델

 
class Email > ActiveRecord::Base 
    belongs_to :contact 
    # validates_uniqueness_of :account, :scope => :contact_id # prevents duplicate, but also skips sibling values 
    # validates :contact_id, :presence => true, :on => :create # causes 422 error 
    validates :account, :presence => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create 
    attr_accessible :contact_id, :email_id, :account, :label 
end 

답변

1

가 없습니다에는 내장이 작업을 수행하는 액티브 가져 오기에 지원.

그러나 가져올 때 contact_id와 이메일 주소를 모두 알고있는 경우 contact_id 및 이메일 주소에 고유 색인을 사용할 수 있습니다. MySQL에서는 ON DUPLICATE KEY UPDATE 지원 (activerecord-import does support this)을 사용하여 중복을 가져 오지 않고 기존 레코드를 업데이트 할 수 있습니다. MySQL에서는 INSERT IGNORE (activerecord-import가 이것을 지원합니다)를 사용하여 인덱스 위반을 유발하는 레코드를 가져올 때 오류를 무시할 수 있습니다 (중복 방지를위한 또 다른 방법입니다).

PostgreSQL 또는 SQLite와 같은 다른 RDMS를 사용하는 경우 INSERT IGNORE와 같이 위반하는 키 제약 조건을 무시할 수있는 방법을 확인하려면 문서를보고 싶을 것입니다. 나는 상자 안의 이중 중복 키 업데이트와 비슷한 것을 지원하지 않는다고 믿는다.

가져올 시간에 contact_id와 이메일 주소를 모두 모르는 경우 코드에서 약간의 사전 작업을 수행해야만 복제 할 것인지 또는 복제 할 것인지에 대한 충분한 정보를 얻을 수 있습니다. 만들기.

희망이 도움이됩니다.

+0

매우 도움이됩니다. 감사합니다. 나는 지금 당장 서버에 내 자신의 메서드를 굴렸다. 결국 클라이언트에서 유효성 검사를 시도하고 그 당시 activerecord-import를 시도합니다. –

관련 문제