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(={}) "[#{self.map{|c| c.to_json()}.join(',')}]" end }
Class Method Summary collapse
- .included(base) ⇒ Object
-
.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
.
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 |