2010-11-20 5 views
3

Je voudrais faire qch comme ceci:Rails d'association avancée

class MyModel < ActiveRecord::Base 
    has_many :locations 
    has_one :location, :class_name => 'Location', :join => "RIGHT JOIN locations ON locations.user_id=mymodels.user_id" 
end 

Alors MyModel ne peut avoir qu'un seul emplacement pour chaque utilisateur mais il a beaucoup. Emplacement Comment puis-je définir cela? THX!

Répondre

4

associations de nommage telles que vous avez une association à la fois pluriel et Les formes singulières d'un nom de modèle peuvent prêter à confusion, cela peut également entraîner un chevauchement de méthodes. Les meilleures pratiques mises à part, vous n'avez généralement pas besoin de fournir du SQL brut. Votre cas ne fait pas exception.

On dirait que MyModel appartient également à l'utilisateur. Et l'utilisateur semble avoir une relation un à plusieurs endroits avec vous pouvez faire quelque chose comme ceci:

Assumeing les modèles suivants basés sur SQL posté:

class User < ActiveRecord::Base 
    has_many :my_models 
    has_many :locations 
end 

class Location <ActiveRecord::Base 
    belongs_to :my_model 
    belongs_to :user 
end 



class MyModel < ActiveRecord::Base 
    has_many :locations 
    belongs_to :user 
    has_one :user_location, through => :user, :source => :location 
end 

Cependant, vous ne savez pas quel endroit vous allez obtenir si l'utilisateur a plusieurs endroits. Mais vous êtes garanti s'il y en a au moins un.

2

Je peux me tromper ...

class MyModel < ActiveRecord::Base 
    has_many :location 
    belongs_to :user 
end 

class Location< ActiveRecord::Base 
    belong_to :my_model 
end 

class User< ActiveRecord::Base 
    has_one :my_model 
end 

le vous pouvez obtenir l'emplacement de l'utilisateur avec MyModel.first.user.location

+1

Vous avez has_many associations, vous devriez donc pouvoir le définir comme une sorte de jointure. Imaginez également une liste de 100 résultats et vous voulez avoir seulement 1 demande à la base de données. – xpepermint