Class: BeerDb::Model::Brewery
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- BeerDb::Model::Brewery
- Extended by:
- TextUtils::AddressHelper, TextUtils::TagHelper, TextUtils::ValueHelper
- Defined in:
- lib/beerdb/models/brewery.rb,
lib/beerdb/models/forward.rb
Class Method Summary collapse
- .create_or_update_from_attribs(new_attributes, values) ⇒ Object
- .create_or_update_from_values(values, more_attribs = {}) ⇒ Object
Instance Method Summary collapse
- #as_json_v2(opts = {}) ⇒ Object
-
#brewpub? ⇒ Boolean
TODO: activerecord supplies brewpub? already? same as attrib; check w/ test case (and remove here).
-
#founded ⇒ Object
support old names (read-only) for now (remove later ??).
- #founded=(value) ⇒ Object
- #l? ⇒ Boolean
- #m? ⇒ Boolean
- #opened ⇒ Object
- #openend=(value) ⇒ Object
Class Method Details
.create_or_update_from_attribs(new_attributes, values) ⇒ Object
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 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'lib/beerdb/models/brewery.rb', line 63 def self.create_or_update_from_attribs( new_attributes, values ) ## fix: add/configure logger for ActiveRecord!!! logger = LogKernel::Logger.root value_tag_keys = [] value_brands = '' ## check for grades (e.g. ***/**/*) in titles (will add new_attributes[:grade] to hash) ## if grade missing; set default to 4; lets us update overwrite 1,2,3 values on update new_attributes[ :grade ] ||= 4 ### check for "default" tags - that is, if present new_attributes[:tags] remove from hash value_tag_keys += ( new_attributes ) ## check for optional values values.each_with_index do |value,index| if match_country(value) do |country| new_attributes[ :country_id ] = country.id end elsif match_state_for_country(value,new_attributes[:country_id]) do |state| new_attributes[ :state_id ] = state.id end elsif match_city(value) do |city| if city.present? new_attributes[ :city_id ] = city.id else ## todo/fix: add strict mode flag - fail w/ exit 1 in strict mode logger.warn "city with key #{value[5..-1]} missing - for brewery #{new_attributes[:key]}" end ## for easy queries: cache state_id (from city) # - check if city w/ state if yes, use it for brewery too if city.present? && city.state.present? new_attributes[ :state_id ] = city.state.id end end elsif match_year( value ) do |num| # founded/established year e.g. 1776 new_attributes[ :since ] = num end elsif match_hl( value ) do |num| # e.g. 20_000 hl or 50hl etc. new_attributes[ :prod ] = num end elsif match_website( value ) do |website| # 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 ] = website end elsif is_address?( value ) # if value includes // assume address e.g. 3970 Weitra // Sparkasseplatz 160 new_attributes[ :address ] = normalize_addr( value ) elsif value =~ /^brands:/ # brands: value_brands = value[7..-1] ## cut off brands: prefix value_brands = value_brands.strip # remove leading and trailing spaces # NB: brands get processed after record gets created (see below) elsif (values.size==(index+1)) && is_taglist?( value ) # tags must be last entry logger.debug " found tags: >>#{value}<<" value_tag_keys += ( value ) else # issue warning: unknown type for value logger.warn "unknown type for value >#{value}< - key #{new_attributes[:key]}" end end # each value ## todo: check better style using self.find_by_key?? why? why not? rec = Brewery.find_by_key( new_attributes[ :key ] ) if rec.present? logger.debug "update Brewery #{rec.id}-#{rec.key}:" else logger.debug "create Brewery:" rec = Brewery.new end logger.debug new_attributes.to_json rec.update_attributes!( new_attributes ) ############################## # auto-add city if not present and country n state present if new_attributes[:city_id].blank? && new_attributes[:country_id].present? && new_attributes[:state_id].present? country_key = rec.country.key ### ## see textutils/helper/address_helper for details about countries supported e.g. ## github.com/rubylibs/textutils/blob/master/lib/textutils/helper/address_helper.rb if country_key == 'be' || country_key == 'at' || country_key == 'de' || country_key == 'cz' || country_key == 'sk' || country_key == 'us' ## todo: how to handle nil/empty address lines? city_title = find_city_in_addr( new_attributes[:address], country_key ) if city_title.present? ## for czech - some cleanup ## remove any (remaining) digits in city title city_title = city_title.gsub( /[0-9]/, '' ).strip city_values = [city_title] city_attributes = { country_id: rec.country_id, state_id: rec.state_id } # todo: add convenience helper create_or_update_from_title city = City.create_or_update_from_values( city_values, city_attributes ) ### fix/todo: set new autoadd flag too? ## e.g. check if updated? e.g. timestamp created <> updated otherwise assume created? ## now at last add city_id to brewery! rec.city_id = city.id rec.save! else logger.warn "auto-add city for #{new_attributes[:key]} (#{country_key}) >>#{new_attributes[:address]}<< failed; no city title found" end end end ################### # auto-add brands if presents if value_brands.present? logger.debug " auto-adding brands >#{value_brands}<" ## todo/fix: use strip_inline_comments (e.g #() or (()) - why?? why not??) # - allows titles as usual (use new syntax for inline comments e.g. #() or (()) for example) # remove optional longer title part in () e.g. Las Palmas (de Gran Canaria), Palma (de Mallorca) value_brands = TextUtils.strip_subtitles( value_brands ) brand_titles = value_brands.split( ',' ) # pass 1) remove leading n trailing spaces brand_titles = brand_titles.map { |value| value.strip } brand_attribs = { brewery_id: rec.id, country_id: rec.country_id, state_id: rec.state_id, city_id: rec.city_id } brand_titles.each do |brand_title| Brand.create_or_update_from_title( brand_title, brand_attribs ) end end ################## ## add taggings ## ## fix: delete all tags first or only add diff? ## fix e.g. ## # [debug] adding 1 taggings: >>trappist<<... # rake aborted! # ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: columns taggable_id, taggable_type, tag_id are not unique: INSERT INTO "taggings" ("created_at", "tag_id", "taggable_id", "taggable_type", "updated_at") VALUES (?, ?, ?, ?, ?) # if value_tag_keys.size > 0 =begin 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.tags << tag end end =end rec # NB: return created or updated obj end |
.create_or_update_from_values(values, more_attribs = {}) ⇒ Object
54 55 56 57 58 59 60 |
# File 'lib/beerdb/models/brewery.rb', line 54 def self.create_or_update_from_values( values, more_attribs={} ) attribs, more_values = find_key_n_title( values ) attribs = attribs.merge( more_attribs ) # check for optional values Brewery.create_or_update_from_attribs( attribs, more_values ) end |
Instance Method Details
#as_json_v2(opts = {}) ⇒ Object
47 48 49 50 |
# File 'lib/beerdb/models/brewery.rb', line 47 def as_json_v2( opts={} ) # NB: do NOT overwrite "default" / builtin as_json, thus, lets use as_json_v2 BrewerySerializer.new( self ).as_json end |
#brewpub? ⇒ Boolean
TODO: activerecord supplies brewpub? already? same as attrib; check w/ test case (and remove here)
43 |
# File 'lib/beerdb/models/brewery.rb', line 43 def brewpub?() brewpub == true; end |
#founded ⇒ Object
support old names (read-only) for now (remove later ??)
33 |
# File 'lib/beerdb/models/brewery.rb', line 33 def founded() since; end |
#founded=(value) ⇒ Object
34 |
# File 'lib/beerdb/models/brewery.rb', line 34 def founded=(value) self.since = value; end |
#l? ⇒ Boolean
40 |
# File 'lib/beerdb/models/brewery.rb', line 40 def l?() prod_l == true; end |
#m? ⇒ Boolean
39 |
# File 'lib/beerdb/models/brewery.rb', line 39 def m?() prod_m == true; end |
#opened ⇒ Object
36 |
# File 'lib/beerdb/models/brewery.rb', line 36 def opened() since; end |
#openend=(value) ⇒ Object
37 |
# File 'lib/beerdb/models/brewery.rb', line 37 def openend=(value) self.since = value; end |