Skip to content

Instantly share code, notes, and snippets.

@bradrobertson
Created September 14, 2010 20:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bradrobertson/579718 to your computer and use it in GitHub Desktop.
Save bradrobertson/579718 to your computer and use it in GitHub Desktop.
# report.rb
# Aliased below. This will check for existing ReportDetail with matching attributes (all of them)
# And if it exists, set the ID, otherwise, set the report_period_detail object using the original method
# Not sure if there is some Railsy way of doing this...
def report_detail_with_find(attrs)
report_detail = ReportDetail.find_or_create_by_duration_and_display_duration_and_starting_month_and_period_offset(attrs[:duration],attrs[:display_duration],attrs[:starting_month],attrs[:period_offset])
report_detail_without_find(report_detail)
end
# Can't use alias_method_chain as we're overwriting a setter, the = sign messes up naming conventions
# Here we're overwriting the default report_period_detail= method to first check if an exis
alias_method :report_detail_without_find, :report_detail=
alias_method :report_detail=, :report_detail_with_find
# Ensure that if our report_detail has changed, we don't update the original as others might reference this
# So instead, search for existing report_period_detail or create new
def before_update
if report_detail.changed?
# attributes method returns keys as strings, we want symbols
attrs = report_detail.attributes.symbolize_keys # convert strings to symbols
[:id, :created_at, :updated_at].each{ |attr| attrs.delete(attr) } # don't assign old, unecessary attrs to new object
report_detail_with_find(attrs)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment