diff --git a/lib/oaken/entry.rb b/lib/oaken/entry.rb index 273455c..46fb5e4 100644 --- a/lib/oaken/entry.rb +++ b/lib/oaken/entry.rb @@ -24,8 +24,8 @@ def load_onto(seeds) transaction do if replay? puts "Replaying #{@file}…" - readers.each do |key, name, id, lineno| - seeds.send(key).instance_eval "def #{name}; find #{id}; end", @file, lineno + readers.each do |key, *args| + define_reader(seeds.send(key), *args) end else reset @@ -43,13 +43,8 @@ def reset self.readers = Set.new end - def define_reader(stored, name, id) - lineno = self.lineno + def define_reader(stored, name, id, lineno) stored.instance_eval "def #{name}; find #{id}; end", @file, lineno readers << [stored.key, name, id, lineno] end - - def lineno - caller_locations(3, 10).find { _1.path == @file }.lineno - end end diff --git a/lib/oaken/stored/active_record.rb b/lib/oaken/stored/active_record.rb index 7255112..6a798ab 100644 --- a/lib/oaken/stored/active_record.rb +++ b/lib/oaken/stored/active_record.rb @@ -5,19 +5,23 @@ def initialize(type, key = nil) delegate :find, :insert_all, to: :type def create(reader = nil, **attributes) + lineno = caller_locations(1, 1).first.lineno + type.create!(**attributes).tap do |record| - define_reader reader, record.id if reader + define_reader reader, record.id, lineno if reader end end def insert(reader = nil, **attributes) + lineno = caller_locations(1, 1).first.lineno + type.new(attributes).validate! type.insert(attributes).tap do - define_reader reader, type.where(attributes).pick(:id) if reader + define_reader reader, type.where(attributes).pick(:id), lineno if reader end end - def define_reader(name, id) - Oaken::Seeds.entry.define_reader(self, name, id) + def define_reader(...) + Oaken::Seeds.entry.define_reader(self, ...) end end