Skip to content

Instantly share code, notes, and snippets.

@krisleech
Last active July 10, 2019 10:09
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 krisleech/d5d4c62a2e5106252f3d4e043588e9fa to your computer and use it in GitHub Desktop.
Save krisleech/d5d4c62a2e5106252f3d4e043588e9fa to your computer and use it in GitHub Desktop.
in-memory belongs_to model

model

class Study < ActiveRecord::Base
  def site
    @site ||= PrefixedSites.find(site_identifier)
  end

  def site=(new_site)
    @site = new_site
    self.site_identifier = new_site.identifier
  end
  
  def self.sites
    Sites.all
  end
end

migration

add_column :studies, :site_identifier, :string

model/value object

class Study
  module Sites
    class Site < Struct.new(:name, :identifier, :prefix); end

    def self.all
      [   
        { name: "St Mary's",            identifier: 'RYJ01@2.16.840.1.113883.2.1.3.2.4.19.2', prefix: 'SM' },
        { name: "Charing Cross",        identifier: 'RYJ02@2.16.840.1.113883.2.1.3.2.4.19.2', prefix: 'CC' },
        { name: "Hammersmith",          identifier: 'RYJ03@2.16.840.1.113883.2.1.3.2.4.19.2', prefix: 'HS' },
        { name: "Queen Charlotte's",    identifier: 'RYJ04@2.16.840.1.113883.2.1.3.2.4.19.2', prefix: 'QC' },
        { name: "Western Eye Hospital", identifier: 'RYJ07@2.16.840.1.113883.2.1.3.2.4.19.2', prefix: 'WE' }
      ].map { |attrs| Site.new(*attrs.values) }
    end

    def self.find(identifier)
      all.find { |s| s.identifier == identifier }
    end
  end
end

View

= f.input :site_identifier, :collection => Study.sites.map { |s| [s.name, s.identifier] }, label: 'Site'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment