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

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