Как получить значения из столбца с именем «object_id» в ActiveRecord? - PullRequest
2 голосов
/ 27 сентября 2010

Мне нужно получить доступ к устаревшей реляционной базе данных через ActiveRecord, и эта база данных использует столбец с именем «object_id» в качестве первичного ключа в таблице. Большинство вещей работает, но когда я пытаюсь указать пользовательский запрос SQL для ассоциации (см. Ниже) ActiveRecord, соответственно, интерпретатор Ruby всегда получает object_id базового объекта "Ruby" вместо значения столбца из базы данных.

Я определил следующий запрос SQL в объявлении has_many:

: finder_sql => "SELECT * FROM t_object, ГДЕ object_id IN (SELECT end_object_id FROM t_object, t_connector WHERE t_object.object_id = # {object_id} И start_object_id = # {object_id})

Я уже пытался решить эту проблему, работая с псевдонимом:

alias_attribute: my_oid,: object_id

и использование «my_oid» в запросе SQL. Но я получил следующее сообщение об ошибке:

NameError: неопределенная локальная переменная или метод my_oid для EaTObject (таблица не существует): Класс

Я также определил метод, который возвращает значение read_attribute ("object_id") и поместил имя метода в запрос SQL вместо "object_id", но когда класс был загружен, я получил сообщение об ошибке, что это имя метода не является имя столбца в таблице базы данных.

Есть ли какое-либо решение для доступа к столбцу с именем "object_id"?

Ответы [ 3 ]

5 голосов
/ 27 сентября 2010

Вы можете использовать этот метод:

read_attribute(:object_id)

Ссылка в документации:

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Read.html#method-i-read_attribute

Поэтому, если вы хотите получить доступ к столбцу object_id при вызове oid, вам нужно удалить псевдоним и определить метод oid

def oid
  read_attribute(:object_id)
end
2 голосов
/ 28 сентября 2010

Другой вариант - self[:object_id], но если вы получаете «Таблица не существует», то, возможно, что-то не так?

Edit: Попробуйте это:

:finder_sql => 'SELECT * FROM t_object WHERE object_id IN (SELECT end_object_id FROM t_object, t_connector WHERE t_object.object_id = #{id} AND start_object_id = #{id})'

NB! одинарные кавычки.

0 голосов
/ 27 сентября 2010

Вы можете использовать t_object.object_id в своем SQL для указания поля object_id, или вы можете использовать псевдоним вашей таблицы t_object, например,

:finder_sql => "SELECT * FROM t_object AS t WHERE t.object_id IN..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...