これは何?
ユーザーのブロックリスト管理をしようとしたが、
ブロックリストを管理するモデルで二つのユーザーモデルを関連させなければならず、
その時に行き詰まってしまったのでここに記します。
何をしたいのか
user
, user_block
二つのモデルを利用して、
user_block内で「誰が」「誰を」ブロックしたのかを管理したい。
モデル作成
bundle exec rails g model User name:string
User |
---|
- name |
bundle exec rails g model UserBlock from:references to:references
この時、migrationファイルにforeign_key
が自動的に付与されるが、そちらは削除する。
UserBlock |
---|
- from_id - to_id |
関連
モデルができたので、from_id
、 to_id
の二つをUserと関連させていく。
user.rb
has_many :user_blocks, foreign_key: :from_id
user_block.rb
belongs_to :from, class_name: 'User'
belongs_to :to, class_name: 'User'
呼び出し
users_controller.rb
before_action :set_user
def block
blocked = current_user.user_blocks.where(to: @user)
blocked || current_user.user_blocks.create(to: @user)
end
def unblock
current_user.user_blocks.where(to: @user).destroy
end
private
def set_user
user = User.find(params[:id])
end