1

Je construis une application Rails accédant à un système hérité. Le modèle de données contient des clients pouvant avoir un ou plusieurs abonnements. Un abonnement appartient toujours à un et un seul client. Bien que pas nécessaire, cette association est représentée par une table de jointure « abonnée », qui ne disposent pas d'une colonne id:Association non normalisée avec les tables héritées dans Rails et ActiveRecord

Column   | Type | Modifiers 
-----------------+---------+----------- 
customer_id  | integer | not null 
subscription_id | integer | not null 

Je possède ce code comme une déclaration de has_and_belongs_to_many à la fois client et Abonnement

class Customer < Activerecord::Base 
    has_and_belongs_to_many :subscriptions, :join_table => "subscribes", 
    :foreign_key => "customer_id", :association_foreign_key => "subscription_id" 
end 
class Subscription < Activerecord::Base 
    has_and_belongs_to_many :customers, :join_table => "subscribes", 
    :foreign_key => "subscription_id", :association_foreign_key => "customer_id" 
end 

Le problème que j'ai est qu'il ne peut y avoir qu'un seul client pour chaque abonnement, pas beaucoup, et la table de jointure contiendra toujours au plus une ligne avec un certain customer_id. Et ainsi, je ne veux pas l'association "clients" sur un abonnement qui renvoie un tableau de (au plus un) client, je veux vraiment la relation "client" qui renvoie le client associé.

Existe-t-il un moyen de forcer ActiveRecord à en faire une relation 1-à-N même si la table jointe elle-même semble en faire une relation N-à-M?

--Thomas

Répondre

1

Je ne sais pas si vous pouvez le faire avec ActiveRecord, mais si vous voulez une solution à ce problème, vous pouvez définir une méthode customer sur le modèle subscription:

class Subscription < Activerecord::Base 
    has_and_belongs_to_many :customers, :join_table => "subscribes", 
     :foreign_key => "subscription_id", 
     :association_foreign_key => "customer_id" 

    def customer 
     self.customers.first 
    end 
end 
+0

Merci, bonnes suggestions simples! Seul inconvénient je ne pense pas que je puisse assigner à travers la "méthode d'accès" mais ce n'est probablement pas un gros problème pour s'assurer que la relation soit toujours créée de l'autre côté. –

Questions connexes