2010-07-09 1 views
1

Я использую Ruby On Rails и paths_of_glory gemметод Типа мешая проблемами столбца типа базы данных

Мне нужно получить доступ к типам достижений, которые пользователь выполняет для того, чтобы отобразить изображение вместе с каждыми из наиболее важных достижений. Когда я пытаюсь получить к нему доступ через @user.achievements.type, я получаю сообщение об ошибке, которое говорит о том, что он хочет вернуть «массив» (как в достижении - массив) вместо фактического возврата элементов в столбце типа моей базы данных.

Поскольку каждый объект ruby ​​имеет метод, называемый type, мой вызов для доступа к столбцу типа базы данных завершается с ошибкой. Когда я пытаюсь изменить запись в таблице, камень paths_of_glory говорит, что для правильной работы ему нужен столбец типа.

Я не совсем уверен, куда идти отсюда, чтобы получить доступ к этому столбцу в базе данных. Какие-либо предложения?

+0

ty для редактирования. – jfedick

ответ

3

Не совсем уверен, что вы здесь просите, но, возможно, это поможет.

Во-первых, @user.achievements - это массив, потому что у вас есть несколько достижений, а метод типа - для отдельных элементов @user.achievements, поэтому это не сработает. Вы должны сделать что-то вроде этого:

@user.achievements.each do |achievement| 
    # Do stuff here 
end 

Что касается type столбца, типа является зарезервированным столбцом в Rails используется специально для одного таблицы наследования, где несколько Rails модель использует одну таблицу базы данных. Таким образом, вы не можете получить к нему доступ напрямую. Я предполагаю, что paths_of_glory использует STI в некотором роде. Вы можете получить доступ к классу модели с чем-то вроде achievement.class, а затем, если вы хотите только его имя, вы можете попробовать achievement.class.to_s.

@user.achievements.each do |achievement| 
    model = achievement.class # => MyAwesomeAchievementClass 
    @image = model.picture # You could write some method in the model like this 
end 
+0

+1 Это выглядит пятно. Если вам нужен тип всех достижений, вы можете сделать '@ user.achievements.map (&: type)', который вернет массив, содержащий типы достижений пользователей или '@ user.achievements.first.type' чтобы получить тип первого достижения для пользователя. –

+0

Когда я пытаюсь запустить @ user.achievements.each do | Achieve |, он дает мне ошибку: Механизм наследования одной таблицы не смог найти подкласс. Эта ошибка возникает из-за того, что тип столбца зарезервирован для хранения класса в случае наследования. Переименуйте этот столбец, если вы не предполагали, что он будет использоваться для хранения класса наследования или перезапишет файл Achievement.inheritance_column, чтобы использовать другой столбец для этой информации. – jfedick

+0

Вы пытались сделать что-либо внутри блока или это ошибка на этой строке? – Karl

Смежные вопросы