Skip to content

Instantly share code, notes, and snippets.

@benui-dev
Created February 27, 2010 06:54
Show Gist options
  • Save benui-dev/316530 to your computer and use it in GitHub Desktop.
Save benui-dev/316530 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby -Ku
# encoding: utf-8
require 'rubygems'
require 'dm-core'
DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite3::memory:')
class User
include DataMapper::Resource
property :id, Serial
property :name, String, :length => 1..255, :required => true, :unique => true
has n, :spoken_languages
has n, :studied_languages
has n, :languages, :through => :spoken_languages # "piggyback" over the spoken_languages relationship
end
class SpokenLanguage
include DataMapper::Resource
property :user_id, Integer, :min => 1, :key => true
property :language_id, Integer, :min => 1, :key => true
belongs_to :user
belongs_to :language
end
class StudiedLanguage
include DataMapper::Resource
property :user_id, Integer, :min => 1, :key => true
property :language_id, Integer, :min => 1, :key => true
belongs_to :user
belongs_to :language
end
class Language
include DataMapper::Resource
property :id, Serial
property :name, String, :length => 1..255, :required => true, :unique => true
has n, :spoken_languages
has n, :speakers, :through => :spoken_languages, :via => :user, :model => 'User'
has n, :studied_languages
has n, :learners, :through => :studied_languages, :via => :user, :model => 'User'
end
DataMapper.auto_migrate!
english = Language.create(:name => 'English')
french = Language.create(:name => 'French')
spanish = Language.create(:name => 'Spanish')
User.create(:name => 'Ben', :spoken_languages => [ english, french ], :studied_languages => [ spanish ] )
User.create(:name => 'Dan', :spoken_languages => [ english ], :studied_languages => [ french ] )
puts '-' * 80
p User.all
p User.all.languages
p Language.all
p Language.all.speakers
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment