“㈱”や”㈲”などの文字をCSVなどからShift_JISで取り込み、rubyでUTF-8に変換するときにUndefinedConversionでハマった。
"㈱".encode('UTF-8', 'Shift_JIS')
> "\x87\x8A" from Shift_JIS to UTF-8
> /User/sanojimaru/workspace/example/lib/string.rb:849:in `encode': "\x87\x8A" from Shift_JIS to UTF-8 (Encoding::UndefinedConversionError)
Shift_JISは一部の機種依存文字に対応していないので、CP932(Windows-31J)を使えば良い。
"㈱".encode('UTF-8', 'CP932')
ActiveRecordのattributeメソッドをオーバーライドする場合、オーバーライド元のattributeを呼ぶには(read|write)_attributeを使う。
例えば、とあるモデルExampleのhogeという属性が空の場合に、fugaという属性の中身を代替として返したい場合。
class Example < ActiveRecord::Base
def hoge
read_attribute(:hoge) || fuga
end
def fuga
read_attribute(:fuga) || 'なんもないっす'
end
end
また、hogeに値をセットしたとき、fugaが空ならfugaにも同じ値をセットしたい場合。
class Example < ActiveRecord::Base
def hoge=(value)
write_attribute(:hoge, value)
fuga = value if fuga.empty?
end
end
これは、ActiveRecordの[]、[]=と同じ実装だ。
attributeメソッドは動的に作られているので、以下のようにsuperを使うのは間違い。
class Example < ActiveRecord::Base
def hoge
super|| fuga
end
end
1件の重大事故の前には29件の軽微な事故があり、その前には300件のヒヤリとする出来事が起きている、という法則。
塵も積もれば何とやら、は塵を小まめに片付ければ難なく防げる。
日々摂取している様々なビタミンのうち、実際に栄養素として作用するのは最も少なかったビタミンの摂取量に制限されてしまう。
過ぎたるは及ばざるが如し。