2010-07-30 9 views
0

J'ai 2 modèles:Ruby on Rails, modèle Rejoint

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

class Category < ActiveRecord::Base 
has_many :videos 
end 

Cela est bien jusqu'à présent, dans mon contrôleur de vidéos pour la page d'index je:

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

etc, etc 
end 

Le produit ci-dessus les éléments suivants requête SQL: SELECT * FROM videosvideos INNER JOIN categories SUR categories .id = videos .category

Whi. ch est bien jusqu'à un certain point, fondamentalement je dois obtenir le nom de la catégorie (un champ dans cette table) de cette façon, je n'ai pas besoin de faire un autre appel dans la vue pour obtenir le nom de catégorie basé sur l'identifiant de la catégorie. Des idées?

Merci, et oui je suis nouveau à ruby, j'ai essayé de lire l'API mais je n'y ai pas trouvé beaucoup d'aide.

Répondre

1

Si vous pensez que l'association de votre classe Video est incorrecte. Il devrait être:

class Video < ActiveRecord::Base 
    belongs_to :category 
end 

Vous pouvez faire @videos = Video.all(:include => :category). Cela récupérera la vidéo et les enregistrements de catégorie associés en utilisant une instruction SQL unique. Incidemment, votre option :class_name sur l'association belongs_to est redondante car ActiveRecord aura déjà déduit automatiquement le nom de la classe du nom de l'association. Vous ne devez utiliser cette option que si vous souhaitez avoir un nom d'association différent de la classe sous-jacente, par exemple. auteurs/Personne.

+0

Quand je fais, les modifications de la requête à: SELECT * FROM 'videos' Aucun rejoindre ou rien, qui est en fait la façon dont je l'avais avant et il n'a jamais travaillé ... :( –

+0

Voir ma réponse éditée –

+0

Merci John, la raison pour laquelle j'ai le: class_name et le renommer en: categories, est que si je ne le fais pas, quand j'édite, j'obtiens l'erreur suivante: ActiveRecord :: AssociationTypeMismatch dans VideosController # update Catégorie (# 2175068700) expected, got Chaîne (# 2148246520) La seule façon J'ai trouvé pour contourner cela était en faisant ce qui précède .... Je pense que j'ai trop gros désordre sur mes mains lol. –

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

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

essayer cette

+0

Je ne pense pas que l'instruction join est correcte: Mysql :: Error: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près des catégories 'INNER JOIN ON categories.id = videos.category' à la ligne 1: SELECT 'videos'. * FROM' videos', catégories où les catégories INNER JOIN ON categories.id = videos.category –