SQLで中間テーブルを含めて3つのテーブルを結合してみた

今回結合したのは、
Posts、Tags、PostTagRelationsの3つのテーブル

最終目的:Tagsテーブルのnameカラムのvalueの値

3つのテーブル結合した図
select * の部分*(ワイルドカード” * ”を指定)で全てを指定している gyazo.com

カラムをPosts.nameとTags.name指定してみた図
だいぶすっきり
gyazo.com

実際には、select t.name form~だけでいいのでさらに絞ってます

rails cで見てみる

  1. 実際に値を取得し、変数sqlに代入
  2. モデル.find_by_sql(変数)で出力する =>配列になってる gyazo.com
  3. 変数に手順2のfind_by_sqlを代入する
  4. 変数[0].カラム名で出力する =>今回は,@tag_name[0].name

gyazo.com

posts.controller.rb

  def edit
    @post = Post.find(params[:id])
    //@form = PostsTag.new(title: @post.title, article_text: @post.article_text, status_id: 
    //@post.status_id, category_id: @post.category_id, user_id: current_user.id, post_id: 
    @post.id,image: @post.image)
    sql = "SELECT t.name FROM posts p JOIN post_tag_relations ptr ON p.id = ptr.post_id JOIN tags t ON ptr.tag_id = t.id WHERE p.id = #{@post.id}"
    Tag.find_by_sql(sql)
  end


text_fildeにvalue: @tag_name[0].nameで表示させました
edit.html

<%= form_with model: @form, url: post_path, method: :put, local: true do |f| %>

      <div class="tag-field", id='tag-field'>
        <%= f.label :name, "タグ" %><br />
        <%= f.text_field :name, value: @tag_name[0].name,class:"input-tag" %>
      </div>
      <div id="search-result">
      </div>

<% end %>

参考: Rails find_by_sqlでSQLクエリを実行してみた - Qiita