سؤال

أنا أستخدم dwilkie أجنبي البرنامج المساعد للقضبان. لدي بيان إنشاء جدول يشبه:

create_table "agents_games", :force => true, :id => false do |t|
  t.references :agents,     :column => :agent_id, :foreign_key => true, :null => false
  t.references :games,      :column => :game_id, :foreign_key => true, :null => false
end

ومع ذلك، يولد هذا SQL التالي:

[4;35;1mSQL (2.7ms)[0m [0mCREATE TABLE "agents_games" ("agents_id" integer NOT NULL, "games_id" integer NOT NULL) [0m

أريد أن يتم استدعاء الأعمدة agent_id و game_id - ليس agents_id و games_id. وبعد كيف يمكنني منع القضبان من التعديل الأعمدة؟


حاولت ما يلي في بلدي enviornment.rb ملف، الذي لم يساعد:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable "agent_id", "game_id"
end
هل كانت مفيدة؟

المحلول 2

وجدت الحل لقصر بلدي. اضطررت إلى إعلان مفاتيح أجنبية بشكل منفصل عن المراجع مثل ذلك:

create_table "agents_games", :force => true, :id => false do |t|
  t.references :agent
  t.foreign_key :agents,     :column => :agent_id, :null => false
  t.references :game
  t.foreign_key :games,      :column => :game_id, :null => false
end

مع هذا، يمكن أن أخرج الاشياء Infactor.

نصائح أخرى

بشكل عام، لا تقاتل اتفاقيات activerecord، إنها جزء من ما يجعل AR يعمل بشكل جيد. ومع ذلك، إذا لهذا حالة واحدة تريد إجراء استثناء، من السهل بما فيه الكفاية عبر بعض الكود في البيئة الخاصة بك، تحقق من http://api.rubyonrails.org/classes/inflector/Inflections.html. مثال.

أعتقد أنك ستحصل على ما تريده إذا كنت تستخدم اسم النموذج المفرد في المرجع، مثل هذا:

create_table "agents_games", :force => true, :id => false do |t|
  t.references :agent,     :foreign_key => true, :null => false
  t.references :game,      :foreign_key => true, :null => false
end

هذه طريقة أكثر وضوحا، مما يعكس أن كل صف من جدول الانضمام الخاص بك سيكون له وكيل واحد و One Game_ID، وبالتالي سيشجع وكيل واحد مع لعبة واحدة.

إن الانعطاف الإضافي أو الإعلانات الرئيسية الأجنبية لن تكون ضرورية في هذه الحالة.

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