Какое еще имя для object_id? - PullRequest
0 голосов
/ 10 марта 2011

Я только что понял, что одна из моих моделей имеет object_id в виде столбца, и это вызовет проблемы.

Любые предложения о возможных альтернативах имени object_id?

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Что должен отображать этот столбец?Это внешний ключ для объектов таблицы?

Выясните, что вы на самом деле пытаетесь представить.Вероятно, это не просто что-то общее во всем мире.(Если это так, может быть, вещей - более подходящее имя.)

Если вы работаете с ограничениями и вам обязательно нужен этот столбец object_id,все еще может ссылаться на него напрямую с помощью attributes[:object_id] и обходить магические методы Rails.

В качестве последнего средства вы можете перезаписать метод собственным методом #object_id, который просто возвращает этот атрибут из вашей базы данных (это то, что Rails сделал с методом #id).Я не могу придумать ничего, что могло бы определенно сломать макушку, но это, вероятно, не очень хорошая идея.Идентификатор объекта используется для множества разных вещей, поэтому вы можете получить странное поведение, если будете сравнивать объекты, использовать свой объект в качестве хеш-ключа и т. Д.

0 голосов
/ 10 марта 2011

Я немного удивлен, что Rails не создает __object_id__ как ссылку на исходную форму object_id, например, send имеет вариант Ruby с именем __send__.

Редактировать: Метод Ruby __id__ представляется __send__ эквивалентом object_id. Может быть безопасно использовать object_id в качестве метода для вашего внешнего ключа, или это может быть не так. На самом деле я не использую Rails в моей текущей работе.

0 голосов
/ 10 марта 2011

Вам не нужно использовать object_id в вашей модели. И в базе данных не должно быть столбца с именем object_id.

object_id - это просто методы по умолчанию, которыми обладают все (кроме BasicObject в Ruby 1.9) объекты (см. docs ).

Возвращает целочисленный идентификатор для obj. Тот же номер будет возвращен на все вызовы идентификатора для данного объекта, и никакие два активных объекта не поделятся идентификатор Заменяет устаревший объект # id .

2.object_id # 5 or anything, but the same
2.id # NoMethodError: undefined method `id' for 2:Fixnum
2.object_id # 5
"anything has object_id".object_id # 22522080
"anything has object_id".object_id # 22447200 - string has different object_id because it's a new instance everytime

Итак, просто используйте id для доступа к идентификатору базы данных классов ActiveRecord. Это тот, который был создан Ruby On Rails для объектов модели.


ИЛИ если вам нужен столбец в базе данных с именем object_id, вы можете создать метод для модели ActiveRecord, например:

def general_id
  read_attribute(:object_id)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...