මම hased_password
ඒ වෙනුවට තීරුවක් වැරදියට නම් කළෙමි hashed_password
.
මෙම තීරුව නැවත නම් කිරීම සඳහා සංක්රමණය භාවිතා කරමින් දත්ත සමුදා ක්රමය යාවත්කාලීන කරන්නේ කෙසේද?
මම hased_password
ඒ වෙනුවට තීරුවක් වැරදියට නම් කළෙමි hashed_password
.
මෙම තීරුව නැවත නම් කිරීම සඳහා සංක්රමණය භාවිතා කරමින් දත්ත සමුදා ක්රමය යාවත්කාලීන කරන්නේ කෙසේද?
Answers:
rename_column :table, :old_column, :new_column
මෙය සිදු කිරීම සඳහා ඔබට වෙනම සංක්රමණයක් නිර්මාණය කිරීමට අවශ්ය වනු ඇත. ( FixColumnName
ඔබ කැමති පරිදි නම් කරන්න.):
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
ඔබගේ අභිමතය පරිදි සංක්රමණය සංස්කරණය කරන්න:
# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
def self.up
rename_column :table_name, :old_column, :new_column
end
def self.down
# rename back if you need or do something else or do nothing
end
end
රේල් පීලි සඳහා 3.1 භාවිතය:
අතර, up
සහ down
ක්රම තවමත් අදාළ වන්නේ නම්, 3.1 ලැඛෙන්නේ රේල් පීලි change
"ඔබගේ දත්ත සමුදාය සංක්රමණය හා නිසි වෙනම පහළ ක්රමය ලිවීමට අවශ්යතාවයක් නොමැතිව, පුනරාවර්තනය වන විට එය ආපසු හැරවීම සඳහා ආකාරය දන්නා 'බව ක්රමය.
වැඩි විස්තර සඳහා " ක්රියාකාරී වාර්තා සංක්රමණය " බලන්න .
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
නැවත නම් කිරීම සඳහා ඔබට තීරු පොකුරක් තිබේ නම් හෝ මේසයේ නම නැවත නැවතත් පුනරාවර්තනය කිරීමට අවශ්ය යමක් තිබේ නම්:
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
change_table
දේවල් ටිකක් පිළිවෙලට තබා ගැනීමට ඔබට භාවිතා කළ හැකිය :
class FixColumnNames < ActiveRecord::Migration
def change
change_table :table_name do |t|
t.rename :old_column1, :new_column1
t.rename :old_column2, :new_column2
...
end
end
end
එවිට db:migrate
සුපුරුදු පරිදි හෝ කෙසේ වෙතත් ඔබ ඔබේ ව්යාපාරය කරගෙන යයි.
රේල් පීලි 4 සඳහා:
ජාලයක් නිර්මාණය Migration
තීරුවක් වෙත ප්රතිනම්කරන සඳහා, රේල් පීලි 4 ජනනය change
වෙනුවට ක්රමය up
හා down
ඉහත කොටසේ සඳහන් පරිදි. ජනනය කළ change
ක්රමය:
$ > rails g migration ChangeColumnName
මෙයට සමාන සංක්රමණ ගොනුවක් සාදනු ඇත:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
මම නොකියමි self.down
" සෑම විටම ප්රතිවිරුද්ධ විය යුතුය". ඔබගේ සංක්රමණයේ සන්දර්භය මත රඳා පවතී. "ප්රතිවිරුද්ධ" ලෙස තැබීම සංක්රමණය පහළට "නිවැරදි" නොවිය හැකිය.
def self.up
හා def self.down
සමග def change
එය වරදක්ද යුතු ආකාරය දැන කරන්නම්.
change
ක්රමය සම්පුර්ණ සාක්ෂි නොවන බව මට පෙනී ගියේය, එබැවින් භාවිතා කිරීමට නැඹුරු වීම up
සහ down
සංකීර්ණ සංක්රමණ සඳහා ක්රම.
මගේ මතය අනුව, මේ අවස්ථාවේ දී, භාවිතා කිරීම වඩා හොඳය rake db:rollback
, ඉන්පසු ඔබේ සංක්රමණය සංස්කරණය කර නැවත ධාවනය කරන්නrake db:migrate
.
කෙසේ වෙතත්, ඔබට අහිමි වීමට අවශ්ය නැති තීරුවේ දත්ත තිබේ නම් භාවිතා කරන්න rename_column
.
තීරුව දැනටමත් දත්ත වලින් පිරී ඇති අතර නිෂ්පාදනයේ ජීවත් වන්නේ නම්, සංක්රමණ සඳහා බලා සිටින අතරතුර නිෂ්පාදනයේ අක්රීය වීම වළක්වා ගැනීම සඳහා පියවරෙන් පියවර ප්රවේශයක් නිර්දේශ කරමි.
පළමුවෙන්ම මම නව නම (ය) සමඟ තීරු එකතු කර පැරණි තීරු නාමයේ අගයන් සමඟ ජනගහනය කිරීම සඳහා ඩීබී සංක්රමණයක් නිර්මාණය කරමි.
class AddCorrectColumnNames < ActiveRecord::Migration
def up
add_column :table, :correct_name_column_one, :string
add_column :table, :correct_name_column_two, :string
puts 'Updating correctly named columns'
execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
end
end
def down
remove_column :table, :correct_name_column_one
remove_column :table, :correct_name_column_two
end
end
එවිට මම එම වෙනස පමණක් කර වෙනස නිෂ්පාදනයට තල්ලු කරමි.
git commit -m 'adding columns with correct name'
කැපවීම නිෂ්පාදනයට තල්ලු කළ පසු, මම දුවන්නෙමි.
Production $ bundle exec rake db:migrate
එවිට මම පැරණි තීරු නම නව තීරු නාමයට යොමු කළ සියලුම අදහස් / පාලකයන් යාවත්කාලීන කරමි. මගේ පරීක්ෂණ කට්ටලය හරහා දිව ගොස් එම වෙනස්කම් කරන්න. (එය දේශීයව වැඩ කරන බවට වග බලා ගැනීමෙන් පසුව සහ සියලු පරීක්ෂණ පළමුව සමත් විය!)
git commit -m 'using correct column name instead of old stinky bad column name'
එවිට මම එම කැපවීම නිෂ්පාදනයට තල්ලු කරමි.
මෙම අවස්ථාවේදී ඔබට සංක්රමණය හා සම්බන්ධ ඕනෑම ආකාරයක අක්රීය කාලයක් ගැන කරදර නොවී මුල් තීරුව ඉවත් කළ හැකිය.
class RemoveBadColumnNames < ActiveRecord::Migration
def up
remove_column :table, :old_name_column_one
remove_column :table, :old_name_column_two
end
def down
add_column :table, :old_name_column_one, :string
add_column :table, :old_name_column_two, :string
end
end
ඉන්පසු මෙම නවතම සංක්රමණය නිෂ්පාදනයට තල්ලු කර ධාවනය කරන්න bundle exec rake db:migrate
කර පසුබිම තුළ කරන්න.
මෙය ක්රියාවලියකට මඳක් සම්බන්ධ බව මට වැටහී ඇත, නමුත් මගේ නිෂ්පාදන සංක්රමණය පිළිබඳ ගැටළු ඇතිවීමට වඩා මම මෙය කිරීමට කැමැත්තෙමි.
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
යටතේ Available Transformations
rename_column(table_name, column_name, new_column_name):
තීරුවක් නැවත නම් කරන නමුත් වර්ගය සහ අන්තර්ගතය තබා ගනී.
rename_column
ද බලන්න .
සංක්රමණ ගොනුවක් සෑදීමට පහත විධානය ක්රියාත්මක කරන්න:
rails g migration ChangeHasedPasswordToHashedPassword
ඉන්පසු db/migrate
ෆෝල්ඩරයේ ජනනය කරන ලද ගොනුවේ rename_column
පහත පරිදි ලියන්න :
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
රූබි ඔන් රේල්ස් හි සමහර අනුවාදයන් සංක්රමණය සඳහා ඉහළ / පහළ ක්රමයට සහාය වන අතර ඔබේ සංක්රමණයේදී ඉහළ / පහළ ක්රමයක් තිබේ නම්:
def up
rename_column :table_name, :column_old_name, :column_new_name
end
def down
rename_column :table_name, :column_new_name, :column_old_name
end
change
ඔබගේ සංක්රමණයේදී ඔබට ක්රමයක් තිබේ නම්:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
වැඩි විස්තර සඳහා ඔබට ගමන් කළ හැකිය: රූබි ඔන් රේල්ස් - සංක්රමණ හෝ ක්රියාකාරී වාර්තා සංක්රමණ .
ඔබේ කේතය වෙනත් එකක් සමඟ බෙදා නොගන්නේ නම්, හොඳම විකල්පය වන්නේ rake db:rollback
සංක්රමණයේදී ඔබේ තීරුවේ නම සංස්කරණය කිරීම සහ rake db:migrate
. ඒක තමයි
තීරුව නැවත නම් කිරීම සඳහා ඔබට වෙනත් සංක්රමණයක් ලිවිය හැකිය
def change
rename_column :table_name, :old_name, :new_name
end
ඒක තමයි.
rake db:rollback
විශිෂ්ට යෝජනාවකි. නමුත් ඔබ කීවාක් මෙන්, සංක්රමණය තවම තල්ලු කර නොමැති නම් පමණි.
විකල්ප විකල්පයක් ලෙස, ඔබ සංක්රමණ පිළිබඳ අදහස සමඟ විවාහ නොවන්නේ නම්, ඇක්ටිව් රෙකෝඩ් සඳහා බලවත් මැණික් වර්ගයක් ඇත, එමඟින් ඔබ වෙනුවෙන් නම වෙනස්වීම් ස්වයංක්රීයව හසුරුවනු ඇත, ඩේටාමපර් විලාසිතාව. ඔබ කළ යුත්තේ ඔබගේ ආකෘතියේ තීරු නම වෙනස් කිරීම පමණි (තවද ඔබ Model.auto_upgrade! ඔබේ model.rb පතුලේ තැබීමට වග බලා ගන්න ) සහ වයල! දත්ත සමුදාය පියාසර කරන විට යාවත්කාලීන වේ.
https://github.com/DAddYE/mini_record
සටහන: ඔබට nuke db / schema.rb අවශ්ය වේ ගැටුම් වලක්වා ගැනීම සඳහා ඔබට අවශ්ය වේ
තවමත් බීටා අදියරවල සිටින අතර පැහැදිලිවම සෑම කෙනෙකුටම නොව තවමත් බලගතු තේරීමක් (මම දැනට එය කිසිදු ගැටළුවක් නොමැතිව සුළු නොවන නිෂ්පාදන යෙදුම් දෙකක භාවිතා කරමි)
ඔබට තීරු නම් මාරු කිරීමට අවශ්ය නම්, අනුපිටපත් තීරු නාම දෝෂයක් වළක්වා ගැනීම සඳහා ඔබට ස්ථාන දරන්නෙකු සෑදිය යුතුය . මෙන්න උදාහරණයක්:
class SwitchColumns < ActiveRecord::Migration
def change
rename_column :column_name, :x, :holder
rename_column :column_name, :y, :x
rename_column :column_name, :holder, :y
end
end
වර්තමාන දත්ත ඔබට වැදගත් නොවේ නම්, ඔබට මෙය භාවිතා කර ඔබගේ මුල් සංක්රමණය පහතට ගත හැකිය:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
උපුටා දැක්වීම් නොමැතිව, මුල් සංක්රමණයේ වෙනස්කම් සිදු කර නැවත සංක්රමණය නැවත ක්රියාත්මක කරන්න:
rake db:migrate
රූබි ඔන් රේල්ස් 4 සඳහා:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
අතින් අපට පහත ක්රමය භාවිතා කළ හැකිය:
අපට සංක්රමණය අතින් සංස්කරණය කළ හැකිය:
විවෘත app/db/migrate/xxxxxxxxx_migration_file.rb
වෙත යාවත්කාලීන hased_password
කරන්නhashed_password
පහත විධානය ක්රියාත්මක කරන්න
$> rake db:migrate:down VERSION=xxxxxxxxx
එවිට එය ඔබගේ සංක්රමණය ඉවත් කරනු ඇත:
$> rake db:migrate:up VERSION=xxxxxxxxx
යාවත්කාලීන කළ වෙනස සමඟ එය ඔබගේ සංක්රමණය එකතු කරනු ඇත.
ධාවනය කරන්න rails g migration ChangesNameInUsers
(හෝ ඔබ එය නම් කිරීමට කැමති ඕනෑම දෙයක්)
දැන් ජනනය කර ඇති සංක්රමණ ගොනුව විවෘත කර ක්රමයට මෙම රේඛාව එක් කරන්න (අතර def change
සහ අතර end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
ගොනුව සුරකින්න, සහ rake db:migrate
කොන්සෝලය තුළ ධාවනය කරන්න
ඔබේ පරීක්ෂා කරන්න schema.db
දත්ත සමුදායේ නම සැබවින්ම වෙනස් වී !
මෙය උපකාරී වේ යැයි සිතමි :)
අපි KISS කරමු . ඒ සඳහා අවශ්ය වන්නේ සරල පියවර තුනක් පමණි. රේල්ස් 5.2 සඳහා පහත සඳහන් ක්රියා කරයි .
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- ඒ ආකාරයෙන් පසුව කේත පදනමේ නඩත්තු කරන්නන්ට එය මනාව පැහැදිලි වේ. (වගුවේ නම සඳහා බහු වචන භාවිතා කරන්න).
# I prefer to explicitly write the
ඉහළට and
පහළටmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
ඔබ ධාවන තරඟ සඳහා පිටත්ව ගොස් ඇත!
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
එම සංක්රමණ ගොනුව විවෘත කර පහත පරිදි එම ගොනුව වෙනස් කරන්න (ඔබේ මුල් පිටපත ඇතුළත් කරන්න table_name
)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
ඔබේ රූබි ඔන් රේල්ස් කොන්සෝලය විවෘත කර ඇතුළත් කරන්න:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
මෙය කිරීමට ඔබට ක්රම දෙකක් තිබේ:
මෙම වර්ගයේ දී එය පෙරළෙන විට ස්වයංක්රීයව එහි ප්රතිලෝම කේතය ක්රියාත්මක කරයි.
def change
rename_column :table_name, :old_column_name, :new_column_name
end
මෙම වර්ගයට, එය ඉහළ ක්රමය ක්රියාත්මක කරන්නේ කවදාද rake db:migrate
සහ පහත ක්රමය ක්රියාත්මක කරන්නේ කවදාද rake db:rollback
:
def self.up
rename_column :table_name, :old_column_name, :new_column_name
end
def self.down
rename_column :table_name,:new_column_name,:old_column_name
end
මම රේල් පීලි 5.2 හි සිටින අතර, සැලසුම් කළ පරිශීලකයෙකුගේ තීරුවක් නැවත නම් කිරීමට උත්සාහ කරමි.
මෙම rename_column
ටිකක් මට වැඩ, නමුත් ඒක වචන :table_name
වූ විසි දෝෂයක් "පරිශීලක වගුව හමුවූයේ නැත". බහු වචන මා වෙනුවෙන් වැඩ කළා.
rails g RenameAgentinUser
ඉන්පසු සංක්රමණ ගොනුව මේකට වෙනස් කරන්න:
rename_column :users, :agent?, :agent
කොහෙද: නියෝජිතයා? යනු පැරණි තීරුවේ නමයි.
යාවත්කාලීන කිරීම - create_table හි සමීප ous ාති සහෝදරයෙක් change_table, පවතින වගු වෙනස් කිරීම සඳහා භාවිතා කරයි. Create_table සඳහා එය සමාන ආකාරයකින් භාවිතා කරන නමුත් වාරණයට ලබා දුන් වස්තුව තවත් උපක්රම දනී. උදාහරණයක් වශයෙන්:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
වෙනත් වෙනස් කිරීමේ ක්රම සමඟ අප කරන්නේ නම් මෙම ක්රමය වඩාත් කාර්යක්ෂම වේ: දර්ශකය ඉවත් කිරීම / එකතු කිරීම / දර්ශකය ඉවත් කිරීම / තීරුව එක් කිරීම, උදා: අපට තවදුරටත් පහත පරිදි කළ හැකිය:
# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
විධානය භාවිතා කරමින් සංක්රමණය ජනනය කරන්න
rails g migration rename_hased_password
ඉන්පසු සංස්කරණය කිරීමෙන් සංක්රමණ වෙනස් කිරීමේ ක්රමයට පහත පේළිය එක් කරන්න
rename_column :table, :hased_password, :hashed_password
මෙය කළ යුත්තේ උපක්රමයයි.
රේල් පීලි 5 සංක්රමණ වෙනස්කම්
උදා:
rails g model ශිෂ්ය ශිෂ්ය නාමය: නූල් වයස: නිඛිලය
ඔබට student_name තීරුව නම ලෙස වෙනස් කිරීමට අවශ්ය නම්
සටහන: - ඔබ රේල් පීලි ධාවනය නොකරන්නේ නම් db: සංක්රමණය වන්න
ඔබට පහත පියවරයන් කළ හැකිය
rails d model ශිෂ්ය ශිෂ්ය නාමය: නූල් වයස: නිඛිලය
මෙය ජනනය කළ සංක්රමණ ගොනුව ඉවත් කරනු ඇත, දැන් ඔබට ඔබගේ තීරුවේ නම නිවැරදි කළ හැකිය
rails g model ශිෂ්යයාගේ නම: නූල් වයස: නිඛිලය
ඔබ සංක්රමණය වී ඇත්නම් (රේල් පීලි db: සංක්රමණය), තීරුවේ නම වෙනස් කිරීමට පහත විකල්ප
රේල් පී g සංක්රමණය RemoveStudentNameFromStudent student_name: string
රේල් පී g සංක්රමණය AddNameToStudent නම: string
rails g migration RemoveStudentNameFromStudentS student_name:string
(සිසුන් බහු වචන වේ)?