2009-07-22 7 views
2

I ont une classe de modèle qui a, entre autres:me séchais has_many dans Rails de

class Group < ActiveRecord::Base 
    has_many :subscriptions 
    has_many :users, :through => :subscriptions 

    has_many :admins, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role = #{ROLES[:admin]}" 
    has_many :subscribers, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role >= #{ROLES[:subscriber]}" 
    has_many :authors, :through => :subscriptions, :source => :user, :conditions => "subscriptions.role >= #{ROLES[:author]}" 
    has_many :pending_subscribers, :through => :subscriptions, :source => :user, :conditions => "subscriptions.pending = true" 
end 

Le nombre de fois :through => :subscriptions, :source => :user est répété me dérange. Je sais dans les fichiers de routes, vous pouvez faire map.with_options. Y a-t-il quelque chose comme ça pour mes associations de modèles?

Répondre

10

with_options est en fait une extension sur Object, afin que vous puissiez l'utiliser dans votre ActiveRecord::Base ainsi

with_options :through => :subscriptions, :source => :user do |obj| 
    obj.has_many :admins, :conditions => "subscriptions.role = #{ROLES[:admin]}" 
    obj.has_many :subscribers, :conditions => "subscriptions.role >= #{ROLES[:subscriber]}" 
    obj.has_many :authors, :conditions => "subscriptions.role >= #{ROLES[:author]}" 
    obj.has_many :pending_subscribers, :conditions => "subscriptions.pending = true" 
end 
+0

Cela fonctionnait très bien, merci! –

2

Vous pouvez créer une méthode qui appelle has_many avec les conditions courantes. Voici une façon de ce séchage avec un bloc:

{ :admins => "subscriptions.role = #{ROLES[:admin]}", 
    :subscribers => "subscriptions.role = #{ROLES[:subscriber]}", 
    :authors => "subscriptions.role >= #{ROLES[:author]}", 
    :pending_subscriptions => "subscriptions.pending = true" }.each do |property, condition| 
    has_many key, :through => :subscriptions, :source => :user, :conditions => condition 
end