2017-10-04 10 views
2

J'ai un modèle User qui intègre un Profile:Comment déclarer un champ d'application basé sur le modèle embarqué attributs avec MongoId

# app/models/user.rb 
class User 
    embeds_one :profile 
end 

# app/models/profile.rb 
class Profile 
    embedded_in :user, inverse_of: :profile 
    field :age, type: integer 
end 

Maintenant, je veux déclarer un champ dans User qui peut lister tous les utilisateurs dont profile.age est > 18.

+0

Est-ce que tu veux aller chercher seulement Bs de A associés portée ou tout? – krishnar

+0

Première chose que vous avez écrit embeds_one ce qui signifie pour A il y aura seulement un B, alors pourquoi âge> 18 ???? deuxièmement: si vous voulez chercher tout b indépendamment de A alors n'utilisez pas embeds_one – krishnar

+0

Laissez l'utilisateur est A et le profil est B et le modèle de profil contient le champ âge Et je veux aller chercher tous les utilisateurs dont l'âge est supérieur à 18 – manojchowdary27

Répondre

1

Vous pouvez interroger les attributs des documents incorporés par:

User.where(:'profile.age'.gt => 18) 

ou portée:

class User 
    embeds_one :profile 

    scope :adults, -> { where(:'profile.age'.gt => 18) } 
end 
+0

Merci beaucoup @stefan cela fonctionne pour moi.J'ai essayé cela plus tôt.Je pense que j'ai fait une erreur de syntaxe à ce moment.Merci, vous avez économisé beaucoup de temps pour moi. – manojchowdary27

+0

pouvez-vous s'il vous plaît upvote ma question aussi.et merci encore pour votre réponse – manojchowdary27

0

Cela devrait enregistrer votre jour -))

Class B  
field :age, type:integer 
scope :adults, -> { where(:age.gt => 18) } 
end 

class A 
    embed_one :b 
    def embed_adults 
    b.adults 
    end 
end 

https://mongoid.github.io/old/en/mongoid/docs/querying.html#scoping

+0

Je l'ai essayé, mais il montre une méthode non définie ou une variable b pour la classe A – manojchowdary27

+0

Et B.all est nul. C'est peut-être parce qu'il n'y a qu'une seule collection A et qu'elle embarque B.Il n'y a pas de telle collection B dans mongodb – manojchowdary27

0

Lorsque vous utilisez encastre u ne peut accéder qu'aux objets associés B de A. Donc, votre besoin-à-dire tous les B où l'âge> x ne fonctionne pas. Alors, optez pour has_one et belongs_to

A.rb

class A 
    has_one :b 
    scope :adults, -> { Bar.adults } 
end 

B.rb

class B 
field :age ,type:integer 
belongs_to :a 
scope :adults, -> { where(:age.gt=> 18)} 
end 
+0

Désolé, il n'est pas possible de changer d'association à has_one.Parce que les deux modèles utilisent une seule collection mongo. Embeds_one association. Merci beaucoup pour votre réponse – manojchowdary27