2010-11-14 16 views
9

पर देवता माइग्रेशन मैं एथलॉगिक से डेविस तक माइग्रेट कर रहा हूं।मौजूदा मॉडल

UPDATED:

वसीयत के प्रवास तालिका उन फिर से बनाने की कोशिश करता है, तो मैं बदल के रूप में आप create_table नीचे देख सकते हैं change_table और अंत में टेबल ड्रॉप दूर करने के लिए मैं क्या जोड़ने के लिए

समस्या यह है कि जब मैं रेक चलाता हूं तो मुझे एक त्रुटि मिलती है।

रेक चलाने पर मुझे यह त्रुटि मिलती है।

== DeviseCreateUsers: migrating ============================================== 
-- change_table(:users) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL 

इस प्रवास

class DeviseCreateUsers < ActiveRecord::Migration 
    def self.up 
    change_table(:users) do |t| 
     t.database_authenticatable :null => false 
     t.recoverable 
     t.rememberable 
     t.trackable 

     # t.confirmable 
     # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both 
     # t.token_authenticatable 


     t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    end 

    def self.down 
    remove_column :users, :database_authenticatable 
    remove_column :users, :recoverable 
    remove_column :users, :rememberable 
    remove_column :users, :trackable 
    remove_index :users, :email 
    remove_index :users, :reset_password_token 
    end 
end 

मेरी schema.rb में मैं पहले से ही Authlogic से है।

create_table "users", :force => true do |t| 
    t.string "username" 
    t.string "email" 
    t.string "crypted_password" 
    t.string "password_salt" 
    t.string "persistence_token" 

मैं इसे संघर्ष के कुछ प्रकार है कि मैं महसूस करने के लिए उन लोगों के साथ सहायकों

धन्यवाद वसीयत से बचने के लिए कैसे नहीं पा रहा हूँ देखता है लगता है!

+0

मॉडल में सहेजे गए डिवाइसेज गुण कृपया जमुरा के उत्तर को सही के रूप में चिह्नित करें। अन्यथा यह प्रश्न "अनुत्तरित प्रश्न सूची" में दिखाई देता है। – kikito

उत्तर

22

आपको जो त्रुटि मिल रही है वह है क्योंकि आप email फ़ील्ड को फिर से बनाने की कोशिश कर रहे हैं जो आपके पास पहले से है। email फ़ील्ड डेविस हेल्पर t.database_authenticatable में बनाया गया है।आप नई प्रणाली के साथ अपनी पुरानी उपयोगकर्ता तालिका का उपयोग कर सकते हैं, लेकिन आपको t.database_authenticatable को शामिल करने की आवश्यकता नहीं है, आपको बस अपने पुराने फ़ील्ड नामों का नाम बदलने की आवश्यकता है। Documentation for Devise में देख रहे हैं, आप देख सकते हैं कि database_authenticatable बस तीन फ़ील्ड बनाता है: ईमेल, एन्क्रिप्टेड_पासवर्ड और पासवर्ड_साल्ट। वे, ईमेल, crypted_password, और password_salt आप पहले से ही अपने authlogic उपयोगकर्ता तालिका में है कि के रूप में ही हैं, ताकि आप तो जैसे change_table उपयोग कर सकते हैं:

def self.up 
    change_table(:users) do |t| 
    t.recoverable 
    t.trackable 
    # rememberable uses remember_token, but this field is different 
    t.rename :remember_token_expires_at, :remember_created_at 
    # these fields are named differently in devise 
    t.rename :crypted_password, :encrypted_password 
    end 
end 
+0

आपके उत्तर के लिए धन्यवाद। समस्या हल हो चुकी है! – Martin

+3

क्या आप दूसरों के लिए अपने समाधान के साथ मूल प्रश्न का उत्तर या अद्यतन कर सकते हैं? – gallamine

0
add_column(:users, :database_authenticatable, {:null=>false}) 

आप इस क्षेत्र को कैसे स्थापित करना है, इस बारे में जानकारी प्रदान नहीं कर रहे हैं। मुझे लगता है कि एक स्ट्रिंग होने की जरूरत है ताकि आप उस जानकारी को पास करना चाहते हैं।

add_column :users, :database_authenticatable, :string, :null=>false 

त्रुटि मिल रहा है के बारे में अधिक जानकारी: क्योंकि यह सामग्री का अभाव है, लेकिन क्या इसका मतलब है कि आप गलत क्रम में अपने प्रवास मिला है

undefined method `to_sym' 

कि त्रुटि माइग्रेशन के लिए वास्तव में निराशा होती है।

उदाहरण के लिए

- अगर आप उपयोग मॉडल के लिए एक बूलियन फ़ाइल जोड़ें:

add_column :users, :user_is_a_jackass, :boolean, :default => false 

ठीक विस्थापित करेगा कि। लेकिन अगर आप इसे इस तरह कार्य करें:

add_column :users, :user_is_a_jackass, :default => false 

आप एक ही त्रुटि क्योंकि आप माइग्रेशन क्या फ़ील्ड प्रकार यह होना चाहिए कह नहीं कर रहे हैं मिल जाएगा।

+0

आपके उत्तर के लिए धन्यवाद। आपने जो कहा वह सच है, हालांकि मुझे लगता है कि मूल प्रवासन तैयार सहायकों का उपयोग करता है और मुझे लगता है कि माइग्रेशन इस प्रकार को परिभाषित करने से परहेज कर रहा था। मैं वास्तव में मैं create_table को change_table में बदल सकता हूं और मैं बस समस्या को अद्यतन करता हूं। – Martin

4
इसके बजाय सिर्फ create_table से पहले निम्न पंक्ति create_table change_table को, तुम बस जोड़ सकते हैं बदलने की

:

rename_table :users, :old_users_authlogic 

फिर, सही create_table के बाद: साथ अनुक्रमित

say_with_time 'Migrating users from Authlogic to Devise...' do 
    execute "INSERT INTO users (id, email, ...) SELECT id, email FROM old_users_authlogic" 
end 

आप उपयोग कर रहे हैं रेफरेंसियल अखंडता, उन्हें नई तालिका में अपडेट करना न भूलें, क्योंकि rename_table उन्हें old_users_authlogic पर इंगित कर देगा।

0

मैं माइग्रेशन फ़ाइल वसीयत को नहीं हटा रहे लेकिन से इसे हटाने के द्वारा इस हल उदात्त। मैंने फिर एक रेल जी माइग्रेशन remove_email_from_foo किया, इस प्रकार ईमेल विशेषता को हटा दिया। मैंने फिर डिवाइज माइग्रेशन फ़ाइल को रद्द कर दिया, जिसने & में माइग्रेशन फ़ाइल को वापस खरीदा, एक रेक डीबी चलाया: माइग्रेट करें।

संबंधित मुद्दे