2010-07-30 3 views
0

У меня есть 2 модели:Рубин на Rails, модель присоединяется

class Video < ActiveRecord::Base 
belongs_to :categories, :foreign_key => "category", :class_name => "Category" 
end 

class Category < ActiveRecord::Base 
has_many :videos 
end 

Это прекрасно до сих пор, в моем контроллере видео для индексной страницы У меня есть:

def index 
@videos = Video.all(:joins => :categories) 

etc, etc 
end 

выше производит следующее SQL-запрос: SELECT * FROM videosvideos INNER JOIN categoriescategories НА .id = videos .category

ИБК. ch в порядке до определенной точки, в основном мне нужно получить название категории (поле в этой таблице), так что мне не нужно делать другой вызов в представлении, чтобы получить имя категории на основе идентификатора категории. Есть идеи?

Спасибо, и да, я новичок в рубине, я пробовал читать API, но не мог найти там большой помощи.

ответ

1

Если вы считаете, что ассоциация в вашем классе Video настроена неправильно. Это должно быть:

class Video < ActiveRecord::Base 
    belongs_to :category 
end 

Вы можете сделать @videos = Video.all(:include => :category). Это приведет к извлечению видео и связанных записей категорий с помощью одного оператора SQL.

Кстати, ваш :class_name вариант в ассоциации belongs_to лишний, поскольку ActiveRecord уже автоматически вывел имя класса из имени ассоциации. Этот параметр следует использовать только в том случае, если вы хотите иметь имя ассоциации, которое отличается от базового класса, например. авторы/Person.

+0

Когда я делаю, изменения запроса к: SELECT * FROM 'videos' Нет соединения или ничего, что на самом деле, как я его раньше, и он никогда не работал ... :( –

+0

См. Мой отредактированный ответ. –

+0

Спасибо, John, причина, почему у меня есть: class_name и переименована в категорию: потому что, если я этого не сделаю, когда я прав, я получаю следующую ошибку: ActiveRecord :: AssociationTypeMismatch в VideoController # update Категория (# 2175068700) ожидается, полученная строка (# 2148246520) Единственный способ Я обнаружил, что обойти это было, выполняя вышеуказанное ... Я думаю, что у меня слишком большой беспорядок на руках. –

0
join_condition = " ,categories where INNER JOIN categories ON categories.id=videos.category" 

@videos = Video.all(:joins => join_condition) 

попробовать это

+0

Я не думаю, что инструкция объединения верна: Mysql :: Ошибка: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с категориями INNER JOIN по категориям category.id = videos.category 'в строке 1: SELECT 'videos'. * FROM' videos', категории, где категории INNER JOIN ON categories.id = videos.category –

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