Upgrade to Pro — share decks privately, control downloads, hide ads and more …

POLO: Working With Real World Data In Development

POLO: Working With Real World Data In Development

Avatar for Ivayr Farah Netto

Ivayr Farah Netto

September 25, 2015
Tweet

More Decks by Ivayr Farah Netto

Other Decks in Programming

Transcript

  1. class Chef < ActiveRecord::Base has_many :recipes has_many :ingredients, through: :recipes

    end class Recipe < ActiveRecord::Base has_many :recipes_ingredients has_many :ingredients, through: :recipes_ingredients end class Ingredient < ActiveRecord::Base end class RecipesIngredient < ActiveRecord::Base belongs_to :recipe belongs_to :ingredient end 20 / 39
  2. inserts = Polo.explore(Chef, 1) # Chef -> ActiveRecord::Base object #

    1 -> Database ID. (Chef with ID 1) INSERT INTO `chefs` (`id`, `name`) VALUES (1, 'Netto') 22 / 39
  3. inserts = Polo.explore(Chef, 1, :recipes) # :recipes -> # ActiveRecord::Associations::HasManyAssociation

    # # a Chef has many Recipes INSERT INTO `chefs` (`id`, `name`) VALUES (1, 'Netto') INSERT INTO `recipes` (`id`, `title`, `num_steps`, `chef_id`) VALUES (1, 'Turkey Sandwich', NULL, 1) INSERT INTO `recipes` (`id`, `title`, `num_steps`, `chef_id`) VALUES (2, 'Cheese Burger', NULL, 1) 24 / 39
  4. inserts = Polo.explore(Chef, 1, { :recipes => :ingredients }) #

    { :recipes => :ingredients } -> # load every recipe and ingredientes ... INSERT INTO `recipes` (`id`, `title`, `num_steps`, `chef_id`) VALUES (1, 'Turkey Sandwich', NULL, 1) INSERT INTO `recipes` (`id`, `title`, `num_steps`, `chef_id`) VALUES (2, 'Cheese Burger', NULL, 1) INSERT INTO `recipes_ingredients` (`id`, `recipe_id`, `ingredient_id`) VALUES (1, 1, 1) INSERT INTO `recipes_ingredients` (`id`, `recipe_id`, `ingredient_id`) VALUES (2, 1, 2) ... INSERT INTO `ingredients` (`id`, `name`, `quantity`) VALUES (1, 'Turkey', 'a lot') INSERT INTO `ingredients` (`id`, `name`, `quantity`) VALUES (2, 'Cheese', '1 slice') ... 26 / 39
  5. asn = ActiveSupport::Notifications # Extracted so this can fit in

    a slide asn.subscribed(collector, 'sql.active_record') do # Set up ActiveRecord::Preloader base_finder = @base_class. includes(@dependency_tree) .where(id: @id) # Store SELECTS in some global storage collect_sql(@base_class, base_finder.to_sql) end 29 / 39
  6. attributes = record.attributes keys = attributes.keys.map do |key| "`#{key}`" end

    values = attributes.map do |key, value| column = record.column_for_attribute(key) attribute = cast_attribute(record, column, value) connection.quote(attribute) end joined_keys = keys.join(', ') joined_values = values.join(', ') table_name = record.class.table_name "INSERT INTO `#{table_name}`" + " (#{joined_keys}) VALUES (#{joined_values})" 31 / 39