Есть ли разница между этими двумя утверждениями - PullRequest
4 голосов
/ 10 февраля 2010
belongs_to :keeper, :class_name => "Staff"
belongs_to "staff", :foreign_key => "keeper_id"

В моих базовых тестах, похоже, они делают то же самое.
Они действительно одинаковы?
Один лучше другого?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2010

Два утверждения определяют одну и ту же связь. Разница в том, как на определенные ассоциации ссылается класс, определяющий эти ассоциации.

Вызов метод assign_to определяет целый ряд новых методов экземпляра для вызывающего класса для обработки заданного отношения. Эти новые методы названы на основе первого аргумента метода assign_to. Как и в большинстве остальных Rails, ActiveRecord будет использовать разумные значения по умолчанию, полученные из первого аргумента, для генерации методов, управляющих связью. Предоставление дополнительных аргументов для assign_to, чтобы просто переопределить эти значения по умолчанию.

На самом деле они идентичны во всем, кроме имени. Все сводится к вашим личным предпочтениям. Вы бы предпочли обратиться к ассоциации с @model.keeper или @model.staff?

Прочтите раздел own_to ссылки ассоциаций, чтобы получить более полное представление о методах, предоставляемых, когда модель принадлежит другой, и о том, как используются параметры, принадлежащие

1 голос
/ 10 февраля 2010

Хотя оба метода эквивалентны с точки зрения определения отношений, причем основным отличием является имя, «лучшим» из двух является тот, который вы используете в настоящее время чаще всего. Это вопрос последовательности больше всего на свете.

Вы хотите сослаться на вещи как:

object.keeper

Или более разумно использовать:

object.staff

Мое личное предпочтение отдается первой форме, но, как правило, для ясности я выражаю все причуды отношений, если они необычны в каком-либо отношении. Определение будет:

belongs_to :keeper,
  :class_name => 'Staff',
  :foreign_key => :keeper_id

Излагая природу отношений в полном объеме, можно уменьшить количество путаницы.

1 голос
/ 10 февраля 2010

Оба кода делают одно и то же, но есть разница. В случае первой строки rails предполагает, что ссылка на Staff сделана с помощью keeper_id, просто добавляется _id. Во втором случае вы указываете, где он должен искать ссылку, давая атрибут :foreign_key.

Разница может быть в том, как вы ссылаетесь на класс, к которому хотите принадлежать. В первом случае это будет XY.keeper, во втором - XY.staff. Зависит от вас, какую форму вы предпочитаете.

1 голос
/ 10 февраля 2010

Нет, эти операторы немного отличаются тем, как они будут давать вам методы в классе, который вы их используете. Предположим, вы определяете эти операторы внутри класса Office, поэтому первый оператор, т. Е.

class Office < ActiveRecord::Base
  belongs_to :keeper, :class_name => "Staff"
end

создает отношения между персоналом и классом Office, но связь между Office и персоналом называется keeper и будет использовать keeper_id в качестве внешнего ключа в классе Office для установления отношений. Поэтому, если у вас есть экземпляр объекта Office в переменной office, вы можете получить Staff для этого объекта office, используя

office.keeper

В другом сценарии

class Office < ActiveRecord::Base
  belongs_to :staff, :foreign_key => "keeper_id"
end

вы создаете связь между персоналом и классом Office, а связь между Office и персоналом называется персоналом и будет использовать keeper_id в качестве внешнего ключа в классе Office для установления связи, как вы указали внешний ключ.

Так что в этом случае, если вы хотите попасть в Staff, тогда вы будете делать

office.staff

В итоге, если вы просто сделаете

belongs_to :staff 

в вашей модели, тогда в соответствии с соглашением о рельсах вы получите метод персонала в вашей модели, который будет использовать staff_id в качестве внешнего ключа для установления связи между моделью Staff и этой моделью. Но rails также дает вам возможность переопределить эти соглашения в исключительных случаях, например, унаследованное приложение. Итак, в основном вы переопределяете соглашение rails в двух приведенных выше инструкциях, используя внешний ключ и имя класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...