Ruby on rails activerecord rejoint - sélectionner les champs provenant de plusieurs tables
modèles:
#StatusMessage model
class StatusMessage < ActiveRecord::Base
belongs_to :users
default_scope :order => "created_at DESC"
end
#User Model
class User < ActiveRecord::Base
has_many :status_messages
end
Dans le contrôleur je veux me joindre à ces deux tables et obtenir des champs de table. par exemple je veux email
champ de User
et status
champ de StatusMessage
. Lorsque j'utilise :
@status = User.joins(:status_messages)
Ou
@status = User.includes(:status_messages)
Il me donne seulement l'utilisateur des données de la table.
Comment puis-je mettre en œuvre cette exigence?
OriginalL'auteur Sayuj | 2011-08-06
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
includes
ici. Il met de données de sorte que vous n'aurez pas une autre requête SQL lorsque vous ne@user.status_messages
.Et oui, vous ne pouvez pas vraiment voir l'effet: vous avez besoin de vérifier vos journaux.
OriginalL'auteur apneadiving
Tout d'abord, je ne pense pas que c'est possible (et raisonnable) ce que vous voulez faire. La raison en est que la relation entre
User
etStatusMessage
est de 1:n, ce qui signifie que chaque utilisateur peut avoir de 0 à n des messages d'état. Comment ces multitudes d'attributs être inclus dans votre modèle d'utilisateur?Je pense que la méthode
joints
dans la classe ActiceRecord a un sens différent, il fait partie de la interface de requête. Voir la question Jointures EXTERNES gauches dans Rails 3Il y a des questions similaires sur le net, voici ce que j'ai trouvé qui correspond le plus:
@user.primary_status_message.status
OriginalL'auteur mliebelt
Lorsque vous utilisez @status = Utilisateur.comprend:status_messages) alors rails eagerley charge les données de toutes les tables.
Mon point est lorsque vous utilisez cet Utilisateur.comprend:status_messages), il charge les données de status_messages aussi, mais ne montre que les utilisateurs des données de la table alors si vous voulez premier utilisateur status_messages alors vous devez @user.d'abord.status_messages
OriginalL'auteur Taimoor Changaiz