LoginSignup
1
1

More than 5 years have passed since last update.

モデル間のリレーションに紐付いた属性を引っ張ってくる方法

Posted at

例えば、CompanyとUserという2つのモデルがあったとして、CompanyUserというのを作って関連づけることはよくある。こんな感じ。

class Company < ActiveRecord::Base
  has_many :company_users
  has_many :users, through: :company_users
end

class User < ActiveRecord::Base
  has_many :company_users
  has_many :companies, through: :company_users
end

class CompanyUser < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
end

CompanyとUserとの間にroleのようなものがあった時、CompanyUserにroleを入れておけばよいが、その引き出し方に少し悩んだ。下のように書けば大丈夫だった。

class Company < ActiveRecord::Base
  has_many :company_users
  has_many :users, -> {
    select('*, user_companies.role as role')
  }, through: :company_users
end

これで、companyの中からusersを見たとき、userはrole属性を持っているように見える。attr_accessor :role をUserの中に定義しているとむしろうまく動かなかったので注意が必要。(Rails 4.2.4で検証)

company = Company.fist
company.users[0].role # => 'hoge'
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1