niki12260714の日記

フリーランスのITエンジニアの呟き。

Ruby学習22日目:#{table_name}の利用

二つのテーブルをjoinさせて値を取得してくる場合、where句でidカラムを指定すると、「どっちのテーブルのidカラムなんだよ(怒)」と怒られます。
なので、前に調べたところ、「arel_table」を使うのが良いみたいだったのですが、今日さらに調べたら、「これはrailsのプライベートメソッドだから、なるべく使わない方が良いよ」という意見もあり、これを使わない方法を模索。
出てきたのが、「#{table_name}」を使うというもの。

使用例としては、「予約リストテーブルの中から、指定したidを持ち、かつ引き取りフラグがfalse状態のデータを取得するスコープ」の定義です。
※idが決まれば一意に定まるわけですが、このidが引き取り済であればデータをエラーを返したいので、条件を付加しているのです

scope :notpick, ->(id){
where("pick_flg = ? AND #{table_name}.id = ?", false, id)
}

 こんな感じで、idの前に「#{table_name}」を付加してあげると、このスコープ定義をしているモデルのテーブルであると解釈してくれます。

あと、updateについて新しく学びましたが、今回は
・findを使って更新するActiveRecodeを取得する
・更新する値を書き換える
・saveする
を使って更新しちゃったんで、updateメソッドは使わなかった……。
でも調べてみると、updateも色んな種類があるみたいなので、次には使うかもしれない。