国境の南

Ruby, Railsメイン

joinの際に任意のキー「同士」で結合したい時には、primary_keyとforeign_keyを使う

Rails - joinの際に任意のキー「同士」で結合したい時には、primary_keyとforeign_keyを使う - Qiita にも投稿しました。 意外と知らなかったです。

下のようなテーブルとモデルがあったとする

articles

- id
- title
- content

article_plots

- id
- article_id
- plot_content

article_histories

- id
- article_id
- article_state

article.rb

  has_many :article_histories
  has_many :article_plots

article_plots.rb

  has_many :article_histories, foreign_key: :article_id, primary_key: :article_id

article_history.rb

  belongs_to :article

この時article_plotsとarticle_historyをAR経由でarticle_idを結合キーとしてjoinするには

article_plots.rb

  has_many :article_histories, foreign_key: :article_id, primary_key: :article_id

こういうふうに設定を足せば互いのarticle_idを見てjoinしてくれる

foreign_keyは自身の何を外部キーとするか、primary_keyは、相手の何を外部キーとするかを設定している。

下みたいなことをする必要はない...

joins('INNER JOIN article_histories ON article_histories.article_id = article_plots.article_id')

オブジェクトにメソッドチェーン当てた後の結果をstubできる

大抵のことが用意されていて凄いですね。

Book.stub_chain("editor.name").and_return(true)

ネストの深いハッシュにtryしたい

2.2.0 (main):0 > params
=> {
  :a => {
    :id => [
      [0] 1,
      [1] 2
    ]
  }
}

2.2.0 (main):0 > params2
=> {
  :b => {
    :id => [
      [0] 1,
      [1] 2
    ]
  }
}

2.2.0 (main):0 > params2[:a][:id]
NoMethodError: undefined method `[]' for nil:NilClass

こんな感じでtryできる。 一見不思議だけど " [ ] "はメソッドで、引数は" [ ] "の中に取るという動きに従ってるだけ。

2.2.0 (main):0 > params3[:a].try(:[], :id)
=> nil

MountableEngineで使うtableにprefixを付けたくない時

Mountable Engineで使うテーブルは、Mountable Engineと同じ名前の接頭語(例えばdashboardというEngineならdashboard_check_flagsみたいな)を付けるのが仕様となってます。

Additionally, an isolated engine will set its own name according to its namespace, so MyEngine::Engine.engine_name will return “my_engine”. It will also set MyEngine.table_name_prefix to “my_engine_”, meaning for example that MyEngine::Article will use the my_engine_articles database table by default.

ここの接頭語を変えたいときは、table_name_prefixを上書きして、nilや任意のprefixを見るようにすればよいです。

mengine/lib/mengine.rb

require "mengine/engine"

#tableのデフォルト接頭語を外す
module Mengine
  def self.table_name_prefix
  end
end

#以下のようにすれば接頭語はadminになる
def self.table_name_prefix
  'admin_'
end

当然こんな設定しないでrailに乗ったほうが良さそうですが。

参考

Rails::Engine

fields_for_with_indexみたいなことをしたい時

こういう感じで出来る模様

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    Project #<%= project_fields.index %>
    ...
  <% end %>
  ...
<% end %>

Note that fields_for will automatically generate a hidden field to store the ID of the record. There are circumstances where this hidden field is not needed and you can pass hidden_field_id: false to prevent fields_for from rendering it automatically.

参考 fields_for (ActionView::Helpers::FormHelper) - APIdock

accepts_nested_attributes_for で地味にハマった

class Spot < ActiveRecord::Base
  accepts_nested_attributes_for :spot_images
  has_many :spot_images
end

これだと

No association found for name `spot_images'. Has it been defined yet?

と怒られる。

class Spot < ActiveRecord::Base
  has_many :spot_images
  accepts_nested_attributes_for :spot_images
end

こうやって関連の定義の下に書かなければいけない
空気を読んでくれそうなものなのにと思いつつはまったのでメモでした

「ありきたりな女」に感動した

www.youtube.com

年齢を重ねたり人生の段階が変わる中で、若い時の繊細な感覚を失っていったという曲。

椎名林檎によれば、両性に伝わるように書かれた歌詞とのこと。

時間の経過やその他色んな出来事を経て、女性からある種類の人を惹きつける何かが消えてしまう、というのは多くの人が共感できる話だと思うけど
男性が外からそう判断するものと、女性自身の身体感を伴う認識では全く性質が違うんだろうなということが感じられて、すごい曲だなあと思いました。

MVにしても、箱からステージに放り出される場面での慌て方がなんかすごくお母さんっぽくて 少女っぽく振る舞う姿から感じる無理感というか微妙な痛々しさが隠し切れてないところなんかはめっちゃ秀逸。

あとPVのこのシーンがかわいい。 f:id:fkagami:20150810220931p:plain

彼女の美しさは成熟した女性のそれへと変化していた。以前の彼女の美しさのかげに見えかくれしていたある種の鋭さ――人をふとひやりとさせるあの薄い刃物のような鋭さ――はずっとうしろの方に退き、そのかわりに優しく慰撫するような独特の静けさがまわりに漂っていた。そんな美しさは僕の心を打った。(略)それでも彼女が失ってしまったもののことを考えると残念だという気がしないでもなかった。あの思春期の少女独特の、それ自体がどんどん一人歩きしてしまうような身勝手な美しさとでも言うべきものはもう二度と戻ってはこないのだ。

ノルウェイの森村上春樹 より

www.amazon.co.jp