Module: CuteKV::Associations

Defined in:
lib/cute_kv/associations.rb

Defined Under Namespace

Modules: ClassMethods, InstanceMethods Classes: Symmetry

Constant Summary collapse

Map =
Class.new
Collection =
Class.new(Array) {
  def to_json(options={})
    "[#{self.map{|c| c.to_json(options)}.join(',')}]"
  end
}

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



39
40
41
42
# File 'lib/cute_kv/associations.rb', line 39

def self.included(base)
  base.send :include, InstanceMethods
  base.extend ClassMethods
end

.map(asso) ⇒ Object

Although relations between real word’s objects are complex, we abstract all relations to three type relations: # one_to_one, # one_to_many, # many_to_many

One_To_One

class User < ActiveObject::Base
  assign :name, :gender=>"male"
end

class Icon < ActiveObject::Base
  assign :path
end
@aaron = User.create(:name=>"aaron")
@icon = Icon.create(:path=>"/tmp/aaron.jpg")

Associations::map(User=>:icon, Icon=>:user)
User will add a instance method :icon
Icon will add a instance method :user
@aaron.icon = @icon
aaron = User.find(@aaron.id)
aaron.icon.path                      #=>"/tmp/aaron.jpg"
icon = Icon.find(@icon.id)
icon.user.name                       #=>"aaron"

Associations::map(User=>[:wife, :husband])
@rita = User.create(:name=>"rita", :gender=>'female')
@aaron.wife = @rita
@aaron.wife                         #=>@rita
@rita.husband                       #=>@aaron

One_To_Many

Associations::map(User=>:books, Book=>:owner)
@book_ruby = Book.create(:name=>"Ruby")
@book_java = Book.create(:name=>"Java")

Many_To_Many

Associations::map(User=>:projects, Project=>:members)
@aaron = User.create(:name=>"aaron")
@nonobo = Project.create(:name=>"nonobo")
@admin = Project.create(:name=>"admin")
@aaron.prjects << @nonobo
@aaron.prjects << @admin
@aaron.projects   #=>[@nonobo, @admin]
@nonobo.members   #=>[@aaron]
@aaron.projects.remove(@nonbo)
@nonbo.members   #=> []
@aaron.projects   #=> [@admin]


221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
# File 'lib/cute_kv/associations.rb', line 221

def map(asso)
  if asso.is_a? String
    #load classes's associations from yml file
    assos = YAML::load(IO.read(asso))
    assos.each {|asso| map(constantize_asso_keys(asso)) }
  else
    singus = Array(asso.delete(:singular)).compact
    Dic::SIN_WORDS.add(singus) unless singus.empty?
    pluras = Array(asso.delete(:plural)).compact
    Dic::PLU_WORDS.add(pluras) unless pluras.empty?
    symmetry = Symmetry.new(asso)
    symmetry.each {|k,v|
      r_k = symmetry.mirror(k)
      r_v = symmetry.mirror(v)
      asso_map = Map.send(:include, self)
      asso_map.connect(k)
      k.class_eval {
        define_method(v) {
          map = asso_map.draw(k,v,self,r_v,r_k)
          if v.singular?
            obj = map.objects.last
            return if obj.nil?
            def obj.remove(object)
              Collection.new.replace([self]).remove(object)
            end
            obj
          else
            map.objects
          end
        }

        define_method("#{v}=") {|object|
          return if object.nil?
          map = asso_map.draw(k,v,self,r_v,r_k)
          vo = self.send(v)
          vo.send(r_v).remove(self) if vo
          rvo = object.send(r_v)
          rvo.send(v).remove(object) if r_v.singular? && rvo
          map.objects << object
        } if v.singular?

      }
    }
  end

end