Skip to content

Instantly share code, notes, and snippets.

@potatosalad
Created March 26, 2011 18:13
Show Gist options
  • Save potatosalad/888496 to your computer and use it in GitHub Desktop.
Save potatosalad/888496 to your computer and use it in GitHub Desktop.
Example of Kraken's EAV at work
# products:
# - _id
# - name
# - kraken_id
# - parent_id
class Product
include Mongoid::Document
include Mongoid::Kraken
field :name, :type => String
end
# create a Kraken object
k_product = Mongoid::Kraken::Kraken.create(:name => "Item")
# create a few Tentacle objects ("sucker" defaults to "String")
k_product.tentacles.create(:name => "description")
k_product.tentacles.create(:name => "posted_at", :sucker => DateTime)
k_product.tentacles.create(:name => "sku", :sucker => Integer)
# four different Krakens with inheritance of Tentacles
k_lighting = k_product.children.create(:name => "Lighting")
k_lighting.tentacles.create(:name => "color", :sucker => Array)
k_part = k_product.children.create(:name => "Part")
k_part.tentacles.create(:name => "part_number", :sucker => Integer)
k_shade = k_part.children.create(:name => "Shade")
k_shade.tentacles.create(:name => "style")
k_shade.tentacles.create(:name => "perimeter", :sucker => Float)
k_lamp = k_lighting.children.create(:name => "Lamp")
k_lamp.tentacles.create(:name => "shade_id", :sucker => BSON::ObjectId)
# creating of Products
p1 = Product.create(:name => "Shade (Round)", :kraken => k_shade)
p2 = Product.create(:name => "Shade (Square)", :kraken => k_shade)
p3 = Product.create(:name => "My Round Lamp", :kraken => k_lamp)
p4 = Product.create(:name => "My Square Lamp", :kraken => k_lamp)
# setting Product attributes
p1.description = "Round and round"
p1.posted_at = Time.now
p1.sku = 1000
p1.part_number = 100
p1.style = "round"
p1.perimeter = (2 * Math::PI) * 10
p1.save
p2.description = "Don't be a square"
p2.posted_at = Time.now
p2.sku = 1001
p2.part_number = 101
p2.style = "square"
p2.perimeter = 4.0 * 5.5
p2.save
p3.description = "It's very, very round."
p3.posted_at = Time.now
p3.sku = 1236
p3.color = [ 255, 0, 0 ]
p3.shade_id = p1['_id']
p3.save
p3.shade.name # => "Shade (Round)"
p4.description = "My other square lamp."
p4.posted_at = Time.now
p4.sku = 1237
p4.color = [ 0, 0, 255 ]
p4.shade_id = p2.id
p4.save
p4.shade.name # => "Shade (Square)"
# What Tentacles have been inherited?
p1.kraken.all_tentacles.flatten.map(&:name)
# => ["style", "perimeter", "part_number", "description", "posted_at", "sku"]
p1.kraken_fields.keys
# => ["style", "perimeter", "part_number", "description", "posted_at", "sku"]
p2.kraken.all_tentacles.flatten.map(&:name)
# => ["style", "perimeter", "part_number", "description", "posted_at", "sku"]
p2.kraken_fields.keys
# => ["style", "perimeter", "part_number", "description", "posted_at", "sku"]
p3.kraken.all_tentacles.flatten.map(&:name)
# => ["shade_id", "color", "description", "posted_at", "sku"]
p3.kraken_fields.keys
# => ["shade_id", "color", "description", "posted_at", "sku"]
p4.kraken.all_tentacles.flatten.map(&:name)
# => ["shade_id", "color", "description", "posted_at", "sku"]
p4.kraken_fields.keys
# => ["shade_id", "color", "description", "posted_at", "sku"]
/* 0 */
{
"_id": {
"$oid": "4d8e2be428c69b43d2000001"
},
"name": "Item",
"tentacle_ids": [
{
"$oid": "4d8e2be928c69b43d2000002"
},
{
"$oid": "4d8e2be928c69b43d2000003"
},
{
"$oid": "4d8e2bea28c69b43d2000004"
}
]
}
/* 1 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d2000005"
},
"name": "Lighting",
"parent_id": {
"$oid": "4d8e2be428c69b43d2000001"
},
"tentacle_ids": [
{
"$oid": "4d8e2bef28c69b43d2000006"
}
]
}
/* 2 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d2000007"
},
"name": "Part",
"parent_id": {
"$oid": "4d8e2be428c69b43d2000001"
},
"tentacle_ids": [
{
"$oid": "4d8e2bef28c69b43d2000008"
}
]
}
/* 3 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d2000009"
},
"name": "Shade",
"parent_id": {
"$oid": "4d8e2bef28c69b43d2000007"
},
"tentacle_ids": [
{
"$oid": "4d8e2bef28c69b43d200000a"
},
{
"$oid": "4d8e2bef28c69b43d200000b"
}
]
}
/* 4 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d200000c"
},
"name": "Lamp",
"parent_id": {
"$oid": "4d8e2bef28c69b43d2000005"
},
"tentacle_ids": [
{
"$oid": "4d8e2bf028c69b43d200000d"
}
]
}
/* 0 */
{
"_id": {
"$oid": "4d8e2be928c69b43d2000002"
},
"sucker": "String",
"name": "description"
}
/* 1 */
{
"_id": {
"$oid": "4d8e2be928c69b43d2000003"
},
"sucker": "DateTime",
"name": "posted_at"
}
/* 2 */
{
"_id": {
"$oid": "4d8e2bea28c69b43d2000004"
},
"sucker": "Integer",
"name": "sku"
}
/* 3 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d2000006"
},
"sucker": "Array",
"name": "color"
}
/* 4 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d2000008"
},
"sucker": "Integer",
"name": "part_number"
}
/* 5 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d200000a"
},
"sucker": "String",
"name": "style"
}
/* 6 */
{
"_id": {
"$oid": "4d8e2bef28c69b43d200000b"
},
"sucker": "Float",
"name": "perimeter"
}
/* 7 */
{
"_id": {
"$oid": "4d8e2bf028c69b43d200000d"
},
"sucker": "BSON::ObjectId",
"name": "shade_id"
}
/* 0 */
{
"_id": {
"$oid": "4d8e2bf728c69b43d200000e"
},
"description": "Round and round",
"kraken_id": {
"$oid": "4d8e2bef28c69b43d2000009"
},
"name": "Shade (Round)",
"part_number": 100,
"perimeter": 62.831853071795862,
"posted_at": "Sat, 26 Mar 2011 12:10:07 GMT -06:00",
"sku": 1000,
"style": "round"
}
/* 1 */
{
"_id": {
"$oid": "4d8e2bf728c69b43d200000f"
},
"description": "Don't be a square",
"kraken_id": {
"$oid": "4d8e2bef28c69b43d2000009"
},
"name": "Shade (Square)",
"part_number": 101,
"perimeter": 22,
"posted_at": "Sat, 26 Mar 2011 12:10:07 GMT -06:00",
"sku": 1001,
"style": "square"
}
/* 2 */
{
"_id": {
"$oid": "4d8e2bf728c69b43d2000010"
},
"color": [
255,
0,
0
],
"description": "It's very, very round.",
"kraken_id": {
"$oid": "4d8e2bef28c69b43d200000c"
},
"name": "My Round Lamp",
"posted_at": "Sat, 26 Mar 2011 12:10:07 GMT -06:00",
"shade_id": {
"$oid": "4d8e2bf728c69b43d200000e"
},
"sku": 1236
}
/* 3 */
{
"_id": {
"$oid": "4d8e2bf828c69b43d2000011"
},
"color": [
0,
0,
255
],
"description": "My other square lamp.",
"kraken_id": {
"$oid": "4d8e2bef28c69b43d200000c"
},
"name": "My Square Lamp",
"posted_at": "Sat, 26 Mar 2011 12:10:18 GMT -06:00",
"shade_id": {
"$oid": "4d8e2bf728c69b43d200000f"
},
"sku": 1237
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment