রেল 3 মাইগ্রেশন: রেফারেন্স কলাম যুক্ত করছে?


162

যদি আমি একটি নতুন রেল তৈরি করি তবে এর সাথে 3 স্থানান্তর (উদাহরণস্বরূপ)

rails g migration tester title:tester user:references

, সবকিছু ঠিকঠাক কাজ করে ... তবে আমি যদি এর লাইনে কিছু দিয়ে একটি কলাম যুক্ত করি:

rails g migration add_user_to_tester user:references

রেফারেন্স ক্ষেত্রটি স্বীকৃত নয়। সংক্ষেপে, প্রশ্নটি: আমি কীভাবে কমান্ড লাইন থেকে একটি রেল স্থানান্তরকে একটি রেফারেন্সিং কলাম যুক্ত করব?

উত্তর:


205

আপনি যদি রেল ৪.x ব্যবহার করে থাকেন তবে এখন আপনি রেফারেন্স সহ মাইগ্রেশন তৈরি করতে পারবেন, এর মতো:

rails generate migration AddUserRefToProducts user:references

যেমন আপনি রেল গাইডগুলিতে দেখতে পারেন



2
আপনি কীভাবে স্বয়ংক্রিয়ভাবে উত্পন্ন নামটির পরিবর্তে বিদেশী কীটির জন্য একটি কলামের নাম নির্দিষ্ট করবেন?
j

@ jwill আপনি পলিমারফিক ব্যবহার করতে পারেন: ব্যবহারকারী: তথ্যসূত্র {পলিমারফিক}}
পাওলো ফিদালগো

@ পাওলো ফিডালগো আপনি কীভাবে এটি করবেন সে সম্পর্কে কিছুটা ব্যাখ্যা করতে পারেন? কিছু লিঙ্কের গাইড হতে পারে? (পলিমারফিক সম্পর্কে কথা বলছেন)
আনোয়ার

@ আনোয়ার: এখানে api.rubyonrails.org/class/ActtiveRecord/ConnicationAdapters/… ডকস রয়েছে
পাওলো

186

সম্পাদনা : এটি একটি পুরানো উত্তর এবং ails.০+ রেলগুলির জন্য প্রয়োগ করা উচিত নয়

আপনি যখন আপনার রেফারেন্স শ্রেণিতে কোনও পূর্ণসংখ্যার আইডি ব্যবহার করতে পারেন তখন আপনাকে রেফারেন্স যুক্ত করার দরকার নেই।

আমি বলতে চাই যে একটি সরল পূর্ণসংখ্যার পরিবর্তে রেফারেন্সগুলি ব্যবহার করার সুবিধাটি হ'ল মডেলটি পূর্বের সাথে পূর্বের সাথে সংজ্ঞায়িত হবে এবং যেহেতু মডেলটি ইতিমধ্যে তৈরি হয়েছে এবং আপনি বিদ্যমান কিছু স্থানান্তরিত করার সময় প্রভাবিত হবেন না, উদ্দেশ্য হ'ল এক প্রকারের ক্ষতি।

সুতরাং আমি পরিবর্তে এটি করতে চাই:

rails g migration add_user_id_to_tester user_id:integer

এবং তারপরে টেস্টার মডেলটিতে ম্যানুয়ালি যুক্ত_তে: ব্যবহারকারী যুক্ত করুন


9
কিন্তু এটি যে এটি সমর্থন করে ডেটাবেজে উপযুক্ত বিদেশী কী বাধা তৈরি করে না?
আবাহগাত

19
না, আফাইক রেলগুলি আপনার জন্য এটির জন্য প্লাগইন যোগ না করা পর্যন্ত কখনই ডাটাবেসে বিদেশী কী বাধা তৈরি করে না।
ড্যানম্যানএ

শুধু এই পোস্টটি অধ্যয়নরত, দয়া করে কীভাবে আমি সর্বোপরি রেফারেন্স যুক্ত করব
এল নিনো

13
ব্যবহারকারীর সাথে সূচকটি যুক্ত করতে মনে রাখবেন: পূর্ণসংখ্যা: সূচক
রিকপাই

3
উত্তরটি তারিখযুক্ত, আধুনিক রেলের জন্য @ পাওলো এর উত্তর দেখুন।
ওয়ানহোপি ফ্রিড

102

দয়া করে নোট করুন যে সম্ভবত আপনার সম্ভবত এই কলামটিতে একটি সূচি প্রয়োজন হবে।

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end

1
কেন? এটি কি বেশিরভাগ সম্পর্কের ক্ষেত্রে সত্য?
আহ্নবিজক্যাড

এটি প্রকৃতপক্ষে পারফরম্যান্সের কারণে এবং যদি আপনার সেই সম্পর্কযুক্ত_র অন্যদিকে has_many / has_one থাকে তবে তা কার্যকর হবে। আপনি যদি নিশ্চিত হন যে আপনি অতিক্রম করবেন না তবে user.testersআপনি সূচকটি বাদ দিতে পারেন।
ইউজিন

1
rails g migration ...উত্পন্ন add_reference :installs, :device, index: trueযা সূচক তৈরি করে।
বি সেভেন

49

উপরের বর্ণিত পূর্ববর্তী দুটি পদক্ষেপের সাথে আপনি এখনও বিদেশী কী বাধাটি মিস করছেন। এই কাজ করা উচিত:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

এখানে একমাত্র আসল উত্তর। বিদেশী কীটি এখানে সর্বাধিক সমালোচিত অংশ
ব্যবহারকারী 2490003

প্রশ্নগুলি রেল 3 এর জন্য জিজ্ঞাসা করার পরে এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত
কার্লোস রোক

35

আপনি কোনও পরিবর্তন স্থানান্তর করতে রেফারেন্স ব্যবহার করতে পারেন। এটি বৈধ রেল ৩.২.১৩ কোড:

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

সিএফ: http://apidock.com/rails/ActtiveRecord/ConnicationAdapters/SchemaStatements/change_table


1
পরিবর্তন এবং ডাউন পদ্ধতি? পরিবর্তে উপরে এবং ডাউন পদ্ধতি না?
মাইকোলবেন

@ মাইকোলবেন হ্যাঁ, এবং আপনি কেবল ডাউন পদ্ধতিটি ছেড়ে দিতে পারেন।
Hut8

@ মাইকোলবেন downপদ্ধতি ছাড়াই , আমি ActiveRecord::IrreversibleMigrationপুনরায় 3.2 ব্যবহার করে ফিরে যাচ্ছিলাম । আমাকেও বদলাতে changeহয়েছিল up
অ্যান্ড্রু গ্রিম ২


8

কোনও কলাম যুক্ত করার সময় আপনাকে সেই কলামটিকে পূর্ণসংখ্যার তৈরি করা প্রয়োজন এবং যদি সম্ভব হয় তবে রেল কনভেনশনগুলির সাথে লেগে থাকুন। সুতরাং আপনার ক্ষেত্রে আমি ধরে নিচ্ছি আপনার ইতিমধ্যে একটি পরীক্ষক এবং ব্যবহারকারীর মডেল এবং পরীক্ষক এবং ব্যবহারকারীদের সারণী রয়েছে।

বিদেশী কী যুক্ত করতে আপনাকে ব্যবহারকারীর নাম (কনভেনশন) সহ একটি পূর্ণসংখ্যা কলাম তৈরি করতে হবে:

add_column :tester, :user_id, :integer

তারপরে পরীক্ষক মডেলটিতে একটি সম্পর্কিত_ যুক্ত করুন:

class Tester < ActiveRecord::Base
  belongs_to :user
end

এবং আপনি বিদেশী কীটির জন্য একটি সূচকও যুক্ত করতে চাইতে পারেন (এটি ইতিমধ্যে আপনার জন্য রেফারেন্সগুলি হ'ল):

add_index :tester, :user_id

8

এটি কৌশলটি করবে:

rails g migration add_user_to_tester user_id:integer:index

আমি এটি পছন্দ করি যে এটি সূচকটি যুক্ত করে যা আপনি সম্ভবত চান।
bheeshmar

3

আপনি নিম্নলিখিত পদ্ধতিতে কমান্ড লাইনের মাধ্যমে আপনার মডেলটিতে রেফারেন্স যুক্ত করতে পারেন:

rails g migration add_column_to_tester user_id:integer

এটি মাইগ্রেশন ফাইল তৈরি করবে যেমন:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

আমি যতবার এটি ব্যবহার করি ততবারই এটি ঠিক কাজ করে ..


3

রেলের জন্য 4

জেনারেটর কলামের ধরণকে রেফারেন্স হিসাবে গ্রহণ করে (এটিও উপলভ্য belongs_to)।

এই স্থানান্তরটি একটি user_idকলাম এবং উপযুক্ত সূচি তৈরি করবে :

$ rails g migration AddUserRefToProducts user:references 

উত্পন্ন:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

রেলের জন্য 3

সহায়ককে বলা হয় রেফারেন্স (এছাড়াও উপলভ্য belongs_to)।

এই মাইগ্রেশন category_idউপযুক্ত প্রকারের একটি কলাম তৈরি করবে । মনে রাখবেন আপনি কলামের নাম নয়, মডেলটির নামটি পাস করেছেন। সক্রিয় রেকর্ড আপনার _idজন্য যোগ করে ।

change_table :products do |t|
  t.references :category
end

আপনার যদি বহুতল belongs_toসমিতি থাকে তবে উল্লেখগুলি প্রয়োজনীয় দুটি কলাম যুক্ত করবে:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

এর সাথে একটি সংযুক্তি_আইডি কলাম এবং একটি স্ট্রিং attachment_typeকলাম একটি ডিফল্ট মান যুক্ত করবে Photo

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.