Class: BeerDb::Models::Beer
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- BeerDb::Models::Beer
- Extended by:
- TextUtils::ValueHelper
- Defined in:
- lib/beerdb/models/beer.rb,
lib/beerdb/models/forward.rb
Class Method Summary collapse
- .create_or_update_from_values(new_attributes, values) ⇒ Object
-
.rnd ⇒ Object
find random beer - fix: use “generic” activerecord helper and include/extend class.
Instance Method Summary collapse
-
#color ⇒ Object
support old names (read-only) for now (remove later).
- #color=(value) ⇒ Object
- #plato ⇒ Object
- #plato=(value) ⇒ Object
Class Method Details
.create_or_update_from_values(new_attributes, values) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# File 'lib/beerdb/models/beer.rb', line 52 def self.create_or_update_from_values( new_attributes, values ) ## fix: add/configure logger for ActiveRecord!!! logger = LogKernel::Logger.root value_tag_keys = [] ### check for "default" tags - that is, if present new_attributes[:tags] remove from hash if new_attributes[:tags].present? more_tag_keys = new_attributes[:tags].split('|') new_attributes.delete(:tags) ## unify; replace _ w/ space; remove leading n trailing whitespace more_tag_keys = more_tag_keys.map do |key| key = key.gsub( '_', ' ' ) key = key.strip key end value_tag_keys += more_tag_keys end ## check for optional values values.each_with_index do |value,index| if value =~ /^country:/ ## country: value_country_key = value[8..-1] ## cut off country: prefix value_country = Country.find_by_key!( value_country_key ) new_attributes[ :country_id ] = value_country.id elsif value =~ /^region:/ ## region: value_region_key = value[7..-1] ## cut off region: prefix value_region = Region.find_by_key_and_country_id!( value_region_key, new_attributes[:country_id] ) new_attributes[ :region_id ] = value_region.id elsif is_region?( value ) ## assume region code e.g. TX or N value_region = Region.find_by_key_and_country_id!( value.downcase, new_attributes[:country_id] ) new_attributes[ :region_id ] = value_region.id elsif value =~ /^city:/ ## city: value_city_key = value[5..-1] ## cut off city: prefix value_city = City.find_by_key( value_city_key ) if value_city.present? new_attributes[ :city_id ] = value_city.id else ## todo/fix: add strict mode flag - fail w/ exit 1 in strict mode logger.warn "city with key #{value_city_key} missing" end elsif value =~ /^by:/ ## by: -brewed by/brewery value_brewery_key = value[3..-1] ## cut off by: prefix value_brewery = Brewery.find_by_key!( value_brewery_key ) new_attributes[ :brewery_id ] = value_brewery.id # for easy queries cache city and region ids # 1) check if brewery has city - if yes, use it for beer too if value_brewery.city.present? new_attributes[ :city_id ] = value_brewery.city.id end # 2) check if brewery has city w/ region if yes, use it for beer to # if not check for region for brewery if value_brewery.city.present? && value_brewery.city.region.present? new_attributes[ :region_id ] = value_brewery.city.region.id elsif value_brewery.region.present? new_attributes[ :region_id ] = value_brewery.region.id end elsif is_year?( value ) # founded/established year e.g. 1776 new_attributes[ :since ] = value.to_i elsif is_website?( value ) # check for url/internet address e.g. www.ottakringer.at # fix: support more url format (e.g. w/o www. - look for .com .country code etc.) new_attributes[ :web ] = value elsif value =~ /^<?\s*(\d+(?:\.\d+)?)\s*%$/ ## abv (alcohol by volumee) ## nb: allow leading < e.g. <0.5% value_abv_str = $1.dup # convert to decimal? how? use float? new_attributes[ :abv ] = value_abv_str elsif value =~ /^(\d+(?:\.\d+)?)°$/ ## plato (stammwuerze/gravity?) e.g. 11.2° ## nb: no whitespace allowed between ° and number e.g. 11.2° value_og_str = $1.dup # convert to decimal? how? use float? new_attributes[ :og ] = value_og_str elsif value =~ /^(\d+(?:\.\d+)?)\s*kcal(?:\/100ml)?$/ ## kcal ## nb: allow 44.4 kcal/100ml or 44.4 kcal or 44.4kcal value_kcal_str = $1.dup # convert to decimal? how? use float? new_attributes[ :kcal ] = value_kcal_str elsif (values.size==(index+1)) && is_taglist?( value ) # tags must be last entry logger.debug " found tags: >>#{value}<<" tag_keys = value.split('|') ## unify; replace _ w/ space; remove leading n trailing whitespace tag_keys = tag_keys.map do |key| key = key.gsub( '_', ' ' ) key = key.strip key end value_tag_keys += tag_keys else # issue warning: unknown type for value logger.warn "unknown type for value >#{value}< - key #{new_attributes[:key]}" end end # each value # rec = Beer.find_by_key_and_country_id( new_attributes[ :key ], new_attributes[ :country_id] ) rec = Beer.find_by_key( new_attributes[ :key ] ) if rec.present? logger.debug "update Beer #{rec.id}-#{rec.key}:" else logger.debug "create Beer:" rec = Beer.new end logger.debug new_attributes.to_json rec.update_attributes!( new_attributes ) ################## # add taggings if value_tag_keys.size > 0 value_tag_keys.uniq! # remove duplicates logger.debug " adding #{value_tag_keys.size} taggings: >>#{value_tag_keys.join('|')}<<..." ### fix/todo: check tag_ids and only update diff (add/remove ids) value_tag_keys.each do |key| tag = Tag.find_by_key( key ) if tag.nil? # create tag if it doesn't exit logger.debug " creating tag >#{key}<" tag = Tag.create!( key: key ) end rec. << tag end end rec # NB: return created or updated obj end |
.rnd ⇒ Object
find random beer - fix: use “generic” activerecord helper and include/extend class
24 25 26 27 |
# File 'lib/beerdb/models/beer.rb', line 24 def self.rnd # find random beer - fix: use "generic" activerecord helper and include/extend class rnd_offset = rand( Beer.count ) ## NB: call "global" std lib rand Beer.offset( rnd_offset ).limit( 1 ) end |
Instance Method Details
#color ⇒ Object
support old names (read-only) for now (remove later)
31 32 33 34 |
# File 'lib/beerdb/models/beer.rb', line 31 def color puts "*** depreceated fn api - use srm" srm end |
#color=(value) ⇒ Object
41 42 43 44 |
# File 'lib/beerdb/models/beer.rb', line 41 def color=(value) puts "*** depreceated fn api - use srm=" self.srm = value end |
#plato ⇒ Object
36 37 38 39 |
# File 'lib/beerdb/models/beer.rb', line 36 def plato puts "*** depreceated fn api - use og" og end |
#plato=(value) ⇒ Object
46 47 48 49 |
# File 'lib/beerdb/models/beer.rb', line 46 def plato=(value) puts "*** depreceated fn api - use og=" self.og = value end |