2017-08-30 3 views
1

Actuellement, j'ai deux classes Theme et Offer mappées par une table de jointure themes_offers contenant theme_id et offer_id.Rails ActiveRecord: Comment puis-je donner un ordre personnalisé pour la table de jointure has_and_belongs_to_many relationship?

J'ai besoin de mettre en œuvre une vue avec l'ordre personnalisé des offres pour chaque thème.

L'idée actuelle est que je dois ajouter une colonne sur la table, et de créer une nouvelle classe activerecord mappée sur la table:

class AddOrderToThemesOffers < ActiveRecord::Migration[5.0] 
    def up 
    add_column :themes_offers, :order, :integer 

    # mark order for each existing orders 

    add_index :themes_offers, [:theme_id, :order], unique: true, name: 'index_offer_order_on_theme' 
    end 

    def down 
    remove_index :themes_offers, 'index_offer_order_on_theme' 
    remove_column :themes_offers, :order, :integer 
    end 
end 

Y aurait-il une meilleure approche? Le problème que j'ai avec cette solution est qu'il sera difficile d'implémenter l'interface activeadmin pour gérer les commandes.

Répondre

2

Une relation Rails has_and_belongs_to_many est conçue pour créer la relation au moyen d'une table qui a deux colonnes uniquement: un ID pour chaque table et rien d'autre, pas même un ID propre. Voir les documents here. Je pense que ce que vous voulez est une relation has_many :through, qui vous permettra d'avoir une table themes_offers avec des attributs additionnels. Les documents sont here.