Web + Life Hack

〜True But Useless〜

【ruby】【rails】外部参照キーで1:多の関連付けを行う方法

今回は、
外部参照キーでuser_id以外のデータを取ってくる方法を
取り上げたいと思います。


例えば
g08m11_shopsというテーブルがあり、g08m11_usersというテーブルと
関連があった場合、
railsの書き方であればshops側に「g08m11_user_id」というキーを持っていれば
各モデルにhas_many、belongs_toで関連付けを行うことが出来ます。

しかし、
今回の場合は「g08m11_user」の定義が混同してしまう(店舗の中のユーザなのかどうなのか)
ため、「updated_by_id」という外部参照キーを用いて
g08m11_usersとg08m11_shopsの関連性を作るというのがそもそものきっかけです。


g08m11_shop.rb

class G08m11Shop < ActiveRecord::Base

belongs_to :updated_by , :foreign_key => :updated_by_id, :class_name => "G08m11User"

g08m11user.rb

class G08m11User &lt; ActiveRecord::Base

has_many :g08m11_shops


shops.contlloer.rb

def create
 @shop = G08m11Shop.new(shop_params) 
 @shop.updated_by = current_user
 respond_to do |format|
   if @shop.save
  format.html { 
    redirect_to shop_path(@shop), notice: t("messages.complete", action: t(
    ["titles", controller_name, action_name].join("."))) 
  }
   format.json { 
   render action: 'show', status: :created, location: @shop 
  } else format.html {
    render action: 'new' 
  } format.json {
    render json: @shop.errors, status: :unprocessable_entity
  } 
  end 
 end 
end


ポイントは
@shop.update_byというインスタンス
現在ログイン中のユーザー情報を取り込んでいる箇所です。

「belongs_to :updated_by , :foreign_key => :updated_by_id, :class_name => "G08m11User"