cacheのキーを削除
例えばmodelへの問い合わせ結果をキャッシュに保存していて、after _saveなどで消したい場合などは
Rails.cache.delete(‘キー名’)でできる。
1 2 3 4 5 6 |
|
例えばmodelへの問い合わせ結果をキャッシュに保存していて、after _saveなどで消したい場合などは
Rails.cache.delete(‘キー名’)でできる。
1 2 3 4 5 6 |
|
saveした時に削除したいときは対象のレコードに対して
1
|
|
で宣言してから、
1 2 |
|
で削除される。
ちなみにsave時にこれを削除してねってマークしたかは
1
|
|
で確認できる。
Ruby のカリー化を日本語で説明してみる -
Qiita
という記事を見たので自分も食べられない方のカリーを使ったものをなんか書いてみました。
irbで実行できます。
1 2 3 4 5 6 7 8 9 10 11 |
|
どんどんtipsがニッチになっていきますね。
Axlxsで作ったファイルがRubyXLで読み取れませんでした。
一度エクセルで開いて保存すると読み取れるようになる。
RubyXLでAxlxsで作成したファイルを読み込むと数値とかは辛うじて所々取れていたので文字コードかと思って色々やってみましたが、このページで解決
Strings outputted not seen by rubyXL ? Issue #349 ? randym/axlsx ? GitHub
pkg = Package.create
したら
pkg.use shared strings = true
する必要があるみたいでした。
これで無事に読みだすことができました。
Axlsxでエクセルと戯れる日々です。
2シート目とかにマスタデータを保持しておいて、1シート目でプルダウンでマスタデータを選ばせたりしています。
変更できないように2シート目はシート全体を保護しております。
今日はAxlsxでセルの保護をしたお話です。
これググっても全然出てきませんでした。
結論から言うとこれでできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
この答えの出し方が最終的にRubyのことはRubyに聞くという方式で解決したのですが、
この解決の仕方がRubyエンジニアっぽいなと思ったのでどうやってこの結論に辿り着いたかダラダラ書こうかと思います。
まずセルの保護をしたいという要件がありました。
コピペエンジニアの端くれとしてまずはググります。
行単位のロックのお話は見つけましたが、セルの保護ではいい結果がありません。
ruby on rails 3 - How do I protect header rows but allow to enter new
rows using AXLSX? - Stack
Overflow
テストは下手なドキュメントよりも役にたつと誰かが言っていたので(実際の使い方のサンプルが見れるので)Axlsxのテストを見てみます。
bundle open axlsxでaxlsxのインストールされたディレクトリを開いて、grep
protectとかやってみます。
いくつかヒットしたのでソースを見てみますがなんのこっちゃわかりません感じです。
とりあえずgrepでひっかかった
Axlsx::CellProtection.new
をキーワードにグーグルで検索してみますが有用な情報は皆無です。
一旦途方にくれます。コーヒーとか飲みます。
おもむろに再度irbを立ち上げます。
とりあえず怪しいものがないかコンソールから確認していってみることにします
1 2 3 4 5 |
|
と打ちます。
cellに保護をかけたいのだからcellオブジェクトにプロパティがあるんじゃないかとあたりをつけます。
sheet.cellとうちます。そんなんねーよと返ってきます。
sheet.cells と打ちます。なんかコンソールに文字がたくさんでます。
A1のセルを取得してみます。
sheet.cells[0,0]とうちます。空の配列が返ってきます。
sheet.cells[0]とうちます。なんか一杯でてきます。
sheet.cells[0].classとうちます。 # = > Axlsx::Cell
お、なんかいいの返ってきました。
sheet.cells[0].methods.grep(/protect/)とかうってみます。
[:protected _methods]しか返ってきません。
一回煮詰まります。
sheet.cells[0].valueとかここで色々他のことをやってみますが、なかなかうまくいきません。
そもそもセル単位で値とか設定できるんかと思いつきます。
ググります。見つけます。
特定のセルを取得するのは以下の方法でした。
sheet.rows[0].cells[0]
sheet.rows[0].cells[0].methodsでメソッド一回全部のメソッドを出してみます。
sheet.rows[0].cells[0].pos # = > [0,0]
とか
sheet.rows[0].cells[0].reference # = > $A $1
とか面白そうなメソッドがあります。
その中にstyle=というメソッドを見つけました。
これってひょっとして行単位のロックであったロックの書式を設定できるのではないかと推測します。
そして出きたのが冒頭のコードです。
sheet.rows[0].cells[0].style = locked
だけでは不十分で
sheet.sheet _protection.password
でパスワードを設定しないといけないとか、保護をかけて必要な所をlockしたりunlockしたりしないといけないとか色々とはまりながらもなんとか答えを出せました。
今回は運も味方してくれたかなぁという気もします。
困ったときはインタラクティブにどんなメソッドがあるかどんな値が設定されているか確認しながら
試しながらやることで問題が解決できるというのは素晴らしいと思いました。
今までdeleteでチクチク消したり、rejectで該当キーをひっかけてhash作り直しリしてました。
exceptなんてあったんですね。
1
|
|
環境はこちら
activerecord(4.1.6)
rails4 acts as _paranoid (0.1.4)
has manyのリレーション先でacts as paranoid指定しているのですが、
nested attributes for リレーション先, allow destroy : true
で何故か物理削除になっていまったので調べてみました。
結論としては
lib/active record/associations/has many association.rb
の112行目で
records.each(&:destroy!)
とdestroy!で消していて、acts as _paranoidのdestroy!は物理削除になるためでした。
何故destroyに!がついているのか
上記が定義されているdelete recordsメソッドを遡ってみます。
delete recordsメソッドはlib/active record/associations/collection association.rb
のremove _recordsの中で呼ばれています(ソースでは492行目)
1 2 3 4 5 6 7 8 9 |
|
んでこれはどこで呼ばれるかというとここで呼ばれています(ソースでは485行目)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
transactionで囲まれています。
ということでdestroyに失敗した時にロールバックするために!をつけているようです。
なのでparanoidのdestroy!をalias method chainで物理削除にしてしまうか。
上記のrecords.each(&:destroy!)をなんとか書き換えてあげると治りそうですね。
今回はこうやって直しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
今回ソース読んでいて知ったんですけど、has manyって削除する時に
before remove
after _remove
ってコールバックが発生するんですね。知らなかった。
Nokogiriを使ってhelperメソッドで特定のinputに属性(クラス名)を追加したくなったのでやってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Nokogiri::HTML.parseだとDOCTYPEとか とか余計なものがついてくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
そういう場合はDocumentFragmentを使うと部分的にhtmlを使える。
@indexで取れます。
1 2 3 4 5 |
|
その他に@firstには最初の一回目のループの時にはtrueが
@lastには最後のループの時にはtrueが入るようです。
@indexは入力欄 _1とかの1とか表示する時に使えそうですね。
2次元配列とか多次元配列を回す時はこうですね。
1 2 3 4 5 6 7 8 9 |
|
ちなみにでコメントです。
という書き方もできます。
勉強がてらRailsのプロジェクトでBackBone.jsでテンプレートにはhandlebarsを使って処理を書いてみました。
viewがslimなのでslimbarsで書いてます。
変数を出力しようとしたら以下のエラー
Unknown line indicator
viewファイルはこんな感じ
1 2 3 |
|
ただしくはこう
1 2 3 |
|
hamlbarsではこう書けてしまうので、slimで書く場合は注意が必要だなと思いました。
1 2 3 |
|
小ネタも小ネタでした。
しかしeachの中ではslimの記法使えないのかな?
こうやらないと出力されない・・・
1 2 3 4 |
|