Как дать внешнему ключу имя в RoR 3? - PullRequest
3 голосов
/ 17 февраля 2011

Как мне дать внешнему ключу имя в RoR?

Я использую следующую команду, чтобы дать внешний ключ:

rails generate scaffold Table2 id:integer Table1:references

Эта команда adds foreign key of Table1 in Table2, но с именем по умолчанию Table1_id.Так, как я могу дать ему произвольное имя, например my_table_f_key вместо Table1_id.

Я использую Ruby 1.9.2 и Rails 3.0.3.


Редактировать: -

В моей project.rb модели:

belongs_to :own, :class_name => User

В моей user.rb модели:

has_many :owned_projects, :class_name => Project, :foreign_key => :owner

как я создал модель своего проекта

rails generate scaffold Project name:string owner:integer

Теперь, когда я получаю доступ к user_id из Project, например project.owner.userid, он выдает исключение.

Ответы [ 2 ]

7 голосов
/ 17 февраля 2011

Исходя из ваших ответов в комментариях, это один из способов реализации того, что вы хотите сделать:

Предполагая две модели в вашем приложении (пользователи и вопросы) и две разные взаимосвязи:

  • Пользователь задает много вопросов, вопрос принадлежит_Аскеру
  • Пользователь редактирует много вопросов, Вопрос принадлежит_ редактору

Эту структуру можно реализовать следующим образом:

rails generate scaffold Question asker_id:integer editor_id:integer

Указание id:integer в вашей команде generate является излишним, так как Rails автоматически сгенерирует этот столбец для вас.Также принято называть ваши внешние ключи в терминах отношений (например, asker_id).

Затем внутри каждой из ваших моделей:

class Question < ActiveRecord::Base
  belongs_to :asker, :class_name => User
  belongs_to :editor, :class_name => User
end

class User < ActiveRecord::Base
  has_many :asked_questions, :class_name => Question, :foreign_key => :asker_id
  has_many :edited_questions, :class_name => Question, :foreign_key => :editor_id
end

Таким образом, вы можете использовать их вместе следующим образом:

@question.asker # => User
@question.editor # => User

@user.asked_questions # => [Question, Question, Question]
@user.edited_questions # => [Question, Question]

Надеюсь, это поможет.

0 голосов
/ 29 сентября 2017

Добавляя к ответу @ Dan, передайте имя класса как String.

ПРЕДУПРЕЖДЕНИЕ ОТКЛОНЕНИЯ: передача класса в class_name устарела и вызовет ArgumentError в Rails 5.2. Он загружает больше классов, чем необходимо, и потенциально создает циклические зависимости. Пожалуйста, передайте имя класса в виде строки

class Question < ActiveRecord::Base
  belongs_to :asker, :class_name => User
  belongs_to :editor, :class_name => User
end

class User < ActiveRecord::Base
  has_many :asked_questions, :class_name => 'Question', :foreign_key => :asker_id
  has_many :edited_questions, :class_name => 'Question', :foreign_key => :editor_id
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...