سؤال

كيف يمكنني تغيير (الافتراضي) نوع ActiveRecord هو IDs ؟ الباحث ليست طويلة بما فيه الكفاية ، وأود أن تفضل طويلة.فوجئت أنه لا يوجد :طويل عن الهجرات - لا مجرد استخدام بعض عشرية?

هل كانت مفيدة؟

المحلول

ائتمانات http://moeffju.net/blog/using-bigint-columns-in-rails-migrations

class CreateDemo < ActiveRecord::Migration
  def self.up
    create_table :demo, :id => false do |t|
      t.integer :id, :limit => 8
    end
  end
end
  • ترى الخيار :id => false مما يؤدي إلى تعطيل التلقائي إنشاء حقل معرف
  • على t.integer :id, :limit => 8 خط إنتاج 64 بت عدد صحيح الميدانية

نصائح أخرى

لتعيين على الافتراضية المفتاح الأساسي نوع العمود ، أو ملفات الهجرة ليست المكان المناسب لفوضى مع.

وبدلا من ذلك، مجرد عصا هذا في الجزء السفلي من config/environment.rb بك

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

وكل ما تبذلونه من الجداول يجب أن تنشأ مع نوع عمود مخصص للid:

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment | 

وبعد أن كنت قد فعلت ما قمت بتعيين القيام به ... فإن السؤال التالي هو على الارجح "كيف يمكنني أن أجعل الأعمدة الرئيسية الخارجية للنفس نوع العمود؟" لأنه لا يعقل أن يكون people.id مفتاح أساسي كما bigint(20) unsigned، وأن person_id int(11) أو أي شيء آخر؟

لتلك الأعمدة، يمكنك الرجوع إلى اقتراحات أخرى، منها مثلا.

t.column :author_id, 'BIGINT UNSIGNED'
t.integer :author_id, :limit => 8

<القوي> UPDATE : لNotinlist، لاستخدام عمود التعسفي لالمفتاح الأساسي على الجداول التعسفية التي تحتاج إليها للقيام الرقص create_table-change_column:

create_table(:users) do |t|
  # column definitions here..
end
change_column :users, :id, :float # or some other column type

ومنها مثلا. إذا أردت guid بدلا من الأعداد الصحيحة لصناعة السيارات في الزيادة،

create_table(:users, :primary_key => 'guid') do |t|
  # column definitions here..
end
change_column :users, :guid, :string, :limit => 36

وهذا أمر يصعب تعيين المفتاح الأساسي مع الهجرات بسبب القضبان يضعها في تلقائيا.

ويمكنك تغيير أي عمود في وقت لاحق من هذا القبيل:

وchange_column :foobars, :something_id, 'bigint'

ويمكنك تحديد هويات غير الأولية، والأنواع المخصصة في الترحيل الأولية مثل هذا:

create_table :tweets do |t|
  t.column :twitter_id, 'bigint'
  t.column :twitter_in_reply_to_status_id, 'bigint'
end

وأين ولدي "BIGINT" يمكنك وضع أي نص من شأنه أن استخدام قاعدة البيانات الخاصة بك لنوع عمود قاعدة البيانات التي تريد استخدامها (على سبيل المثال، "غير موقعة طويل").

إذا كنت تحتاج إلى عمود الهوية الخاصة بك أن تكون BIGINT، وأسهل طريقة للقيام بذلك سيكون لإنشاء الجدول، ثم تغيير العمود في نفس الهجرة مع change_column.

ومع كيو وسكليتي، التغييرات المخطط هي الذرية حتى هذا لن يترك قاعدة البيانات في حالة غريبة إذا فشل الهجرة. مع الخلية عليك أن تكون أكثر حذرا.

واستنادا إلى وثائق API القضبان، والخيارات الممكنة لنوع هي:

:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean

ويمكنك استخدام: عشري، أو يمكنك تنفيذ أمر مباشرة إذا كنت بحاجة إلى:

class MyMigration
  def self.up
    execute "ALTER TABLE my_table ADD id LONG"
  end
end

وكما أشار wappos بها، يمكنك استخدام خيارات المساعدة مثل: الحد أن أقول أكتيفيريكورد كيفية كبيرة تريد العمود أن يكون. لذلك كنت استخدم: عمود كثافة مع أكبر: الحد

إذا كان أي شخص يحتاج هذا العمل مع الإنترنت، إنشاء مهيئ مثل هذا:

# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'

ولأن التحميل كسول في القضبان 3.2 (والإصدارات ربما السابقة)، لن تكون هناك حاجة ActiveRecord::ConnectionAdapters::PostgreSQLAdapter حتى تأسيس اتصال قاعدة البيانات.

في rails4, يمكنك أن تفعل ذلك.

التالي هو مثال لإنشاء Dummy نموذج في rails4 & postgres,

xxx_migrate_dummies.rb:

class CreateDummies < ActiveRecord::Migration
  def change
    create_table :dummies, :id => false do |t|
      t.column :id, :serial8, primary_key: true
      t.string :name, :limit => 50, null: false
      t.integer :size, null: false

      t.column :create_date, :timestamptz, null: false
    end
  end
end

ماذا فعلت:

  • استخدام serial8 كما نوع الهوية التي هي 64 بت عدد صحيح, و تعريف primary key.
  • استخدام timestamptz كما والوقت نوع ، والتي تحتوي على التوقيت المعلومات ، هذا هو التطبيق التي تذهب عبر العديد من المناطق الزمنية.

والقضبان 3، الخلية:

t.column :foobar, :int, :limit => 8

لا يعطي لي BIGINT، فقط عدد صحيح. ومع ذلك،

t.column :twitter_id, 'bigint'

ويعمل بشكل جيد. (على الرغم من أنه لا يربطني إلى الخلية).

والاقتراض من حلول أخرى، ويعدل عن ما عملت بالنسبة لي مؤخرا.

إضافة إلى ملف في config/initializers. ويعلن نوع العمود الجديد (مقتبس من اقتراح chookeat ل).

وActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"

والهجرات التي تستخدم معرف طويلة هي على هذا النحو:

    create_table :notification_logs, :id => false do |t|

      t.column :id, :long_primary_key
      # ...
    end

وكتبت جوهرة تدعى أكتيفيريكورد-native_db_types_override التي تمكنك من تغيير أنواع البيانات التي سيتم استخدامها في الهجرات الخاص بك.

في Gemfile، إضافة:

gem 'activerecord-native_db_types_override'

وبعد ذلك في التكوين / environment.rb، لاستخدام هويات طويلة في بوستجرس، إضافة:

NativeDbTypesOverride.configure({
  postgres: {
    primary_key: { name: "bigserial primary key"}
  }
})

وانظر لها README للحصول على معلومات ما يصل إلى التاريخ.

ويمكنك القيام بذلك من هذا القبيل:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users, id: :bigserial do |t|
      t.string :name
    end
  end
end

وتصحيح كيفية تغيير نوع العمود primary key الافتراضي:

وبدلا من:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

ويجب ان تفعل:

ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"

ووإلا فإنك لن تكون قادرا على إضافة قيود foreign key في طبقة قاعدة البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top