2009-08-14 4 views
0

Considérez ceci:Simple Table Relation

class User < ActiveRecord::Base 
    # name, email, password 
end 

class Article < ActiveRecord::Base 
    # user_id, title, text 
end 

class Favorites < ActiveRecord::Base 
    # user_id, article_id 
end 

Comment puis-je mettre tout cela ensemble d'une manière que je peux avoir @ user.articles (articles créés par l'utilisateur) et @ user.favorite_articles (articles préférés de Modèle préféré)

Merci d'avance!

Répondre

1

Vous pouvez utiliser une association has_many :through pour aller chercher les articles préférés de l'utilisateur. Vous pouvez également l'utiliser pour récupérer les utilisateurs qui ont favorisé un article donné.

class User < ActiveRecord::Base 
    has_many :articles 
    has_many :favorites 
    has_many :favorite_articles, :through => :favorites, :source => :article 
end 

class Article < ActiveRecord::Base 
    belongs_to :user 
    has_many :favorites 
    has_many :favorited_by_users, :through => :favorites, :source => :user 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :article 
    belongs_to :user 
end 
+0

C'est tout, merci! –

+0

aha +1, vous me battez :) – marcgg

1

Si je comprends bien ce que vous vouliez, je dirais que

class User < ActiveRecord::Base 
    has_many :articles 
    has_many :favorite_articles, :through => :favorites, :source => :article 
end 

class Article < ActiveRecord::Base 
    has_and_belongs_to_many :user 
end 

class Favorites < ActiveRecord::Base 
    has_and_belongs_to_many :user 
    has_one :article 
end 

édité: favorite_articles ajouté

+0

Le problème est que je me retrouve avec un objet Favoris au lieu d'un objet Article. Je sais qu'il y a une façon très simple de faire ça avec Rails mais j'ai complètement oublié. Peut-être que c'était quelque chose à propos d'avoir une table users_videos et ensuite d'utiliser has_many: through, mais je ne suis pas sûr. Une idée? –

+0

J'ai édité mon anwser pour inclure ce que vous vouliez. Cela devrait fonctionner correctement – marcgg

Questions connexes