Sorry if this is a double post. I sent it right after subscribing to
the group yesterday, and I haven't received it or see it in
groups.google.com.

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