Hi,

I have a many to many association in which the join table has
additional columns. I'm modeling a deck management application for
Magic the Gathering, and I have the following tables:

DB.create_table(:mtg_database) do
        Integer :gatherer_id
        primary_key [:gatherer_id]
        String :name
        String :cost
        String :spell_type
        String :power_toughness
        String :rules
        String :sets
end

DB.create_table(:deck) do
        primary_key :id
        String :name
        String :format
        String :description
end

DB.create_table(:deck_card) do
        foreign_key :deck_id, :deck
        foreign_key :gatherer_id, :mtg_database
        primary_key [:deck_id, :gatherer_id]
        Integer :qty
end

The deck_card table contains the relation between a deck and the cards
it contains. For each deck and card, it has an additional column named
qty which contains the number of such card a deck has. What I would
like to do is have a method in a deck model that allows me to add a
card to a deck, which will handle the qty field correctly (set it to 1
the first time a card is added to a deck, increment it from that point
on). I have managed to make it work, checking an old message from this
list related to books and locations, as so:

class Card < Sequel::Model(:mtg_database)
    unrestrict_primary_key
    one_to_many :deck_card
end

class DeckCard < Sequel::Model(:deck_card)
    many_to_one :card, :key => :gatherer_id
    many_to_one :deck
end

class Deck < Sequel::Model(:deck)
    many_to_many :cards, :join_table=>:deck_card, :right_key =>
:gatherer_id, :order=> :name
    one_to_many :deck_card

    def deck_card(card)
      deck_card_dataset[:gatherer_id => card.gatherer_id]
    end

    def add_card_to_deck card
        deck_card = deck_card card
        if deck_card
            deck_card.update({:qty => deck_card.qty + 1})
        else
            DeckCard.create({:card => card, :deck => self, :qty => 1})
        end
    end
end

This works and I'm able to add cards to decks like this:

deck = Deck.first(:id => some_id)
deck.add_card_to_deck(Card.first(:gatherer_id => some_card_id))

But I have some questions:

1.- Is this the best way to handle this?
2.- I would now need a way to iterate through all the deck's cards
having access to both the card info (all columns in mtg_database
table) along with the qty column from the join table. What would be
the best way to do that?
3.- I had to add the unrestrict_primary_key in the Card model. Until I
did, I wasn't able to create cards setting the gatherer_id, which is
an external id that I want to have as pk of that table. Am I doing
something wrong? I'm creating Cards like this:

    def update_or_create_card params
        card = Card.first :gatherer_id => params[:gatherer_id]
        card = Card.new unless card
        card.gatherer_id = params[:gatherer_id]
        card.name = params[:name]
        card.cost = params[:cost]
        card.spell_type = params[:type]
        card.power_toughness = params[:power_toughness]
        card.rules = params[:rules]
        card.sets = params[:sets]
        card.save
        card
    end

Regards,

Jesus.

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to