2015-01-07 5 views
0

Я пытаюсь сохранить записи, используя файл .rake. Но при попытке сохранить изменения я получаю сообщение об ошибке.Ошибка при сохранении с использованием активных записей

Error.message

SQLite3::ConstraintException: UNIQUE constraint failed: versions.id: INSERT INTO "versions" ("app_id", "created_at", "icon_url", "id", "plist_url", "updated_at", "version_number") VALUES (?, ?, ?, ?, ?, ?, ?) 

inbox.rake файл

namespace :inbox do 
    desc 'Check inbox for new app builds' 
    task process_inbox: :environment do 
    # initialize s3 client 
    s3 = AWS::S3.new 
    bucket = s3.buckets['my-bucket'] 
    s3_host = 'https://...s3.amazonaws.com/' 

    exclude_inbox = bucket.objects.select do |s3_object| 
     s3_object.key.exclude? '_inbox' 
    end 
    #find plist within the inbox 
    plist_objects = exclude_inbox.select do |s3_object| 
     s3_object.key.include? 'plist' 
    end 

    for plist_object in plist_objects 
     plist = CFPropertyList::List.new(:data => plist_object.read) 
     data = CFPropertyList.native_types(plist.value) 

     name = data['items'][0]['metadata']['title'] 
     bundle_version = data['items'][0]['metadata']['bundle-version'] 
     plist_copy = plist_object.copy_to("#{name}/#{bundle_version}/#{name}.plist") 
     kind = data['items'][0]['metadata']['kind'] 

     plist = CFPropertyList::List.new(:data => plist_copy.read) 
     data = CFPropertyList.native_types(plist.value) 
     icon_url = data['items'][0]['assets'][1]['url'] 
     full_url = plist_copy.url_for(:read) 

     icon = bucket.objects[icon_url.gsub(s3_host, '')] 

     #find app or create a new app based on its name and kind 
     app = App.find_or_initialize_by(name: name, app_type: kind) 
     #app.save unless app.id 
     #find version or create new version base on app_id and bundle_version 
     version = Version.find_or_initialize_by(app_id: app.id, id: bundle_version) 
     version.plist_url = full_url.scheme + '://' + full_url.host + full_url.path 
     version.icon_url = icon.copy_to("#{name}/#{bundle_version}/#{icon_url.split('/').last.gsub('~','_')}").url_for(:read).to_s 
     version.version_number = bundle_version 
     version.app = app 
     #update app version number 
     app.version_number = version.version_number 
     #save changes 
     begin 
     app.save 
     version.save 
     puts app.attributes , version.attributes 
     rescue => error 
     puts error.message 
     end 
    end 

    end 
end 
+0

В сообщении об ошибке говорится, что все это 'UNIQUE constraint failed '. 'versions.id' требуется уникальным, и вы пытаетесь вставить запись с уже существующим идентификатором – RocketR

+0

@RocketR Я это понимаю, но я не знаю почему. Теперь, когда в моем коде я назначаю идентификатор вручную. –

ответ

1

Это проблематичной линия:

version = Version.find_or_initialize_by(app_id: app.id, id: bundle_version) 

Это более многословным, но, вероятно, больше того, что вы хотите:

version = Version.find_by(id: bundle_version, app_id: app.id) || Version.new(app_id: app.id) 
+0

@Vimsha На самом деле это было потому, что я хотел, но был 'version = Version.find_or_initialize_by (version_number: bundle_version, app_id: app.id)'. Благодаря вам и –

1

Эта линия проблема

Version.find_or_initialize_by(app_id: app.id, id: bundle_version) 

Я предполагаю, что идентификатор является первичным ключом здесь. Так как вы делаете find_or_initialize на два значения, вы получите новую версию, если есть версия в базе данных с заданной bundle_version, но разные APP_ID

Вы, вероятно, должны делать,

version = Version.find_or_initialize_by(id: bundle_version) 
version.app_id = app.id 
+0

Жуткие, как наши ответы! Но я думаю, что ты выиграл гонку за волосы. :-) – evanbikes

Смежные вопросы