Rails에서 중간 테이블의 외래 키 이외에 갖게 한 열에 view로 액세스하는 방법

8125 단어 루비Rails4
Rails에서 다 대다 연관으로 중간 테이블에 외래 키 이외의 열에 액세스하는 방법입니다.
likes 테이블의 외래 키는 이번 경우 user_idproduct_id 입니다. 외래 키 이외에도 like_type을 가지고 있습니다.
이 like_type 열이지만 0의 경우 unlike, 1의 경우 like로 관리하고 싶습니다. like_type은 enum으로 관리합니다.

이번에는 각 유저가 like한 product 리스트를 취득하면서 likes 테이블의 like_type 컬럼도 view로 표시하고 싶습니다.



테이블 정의



schema.rb
  create_table "likes", force: :cascade do |t|
    t.integer  "product_id", limit: 4, null: false
    t.integer  "user_id",    limit: 4, null: false
    t.integer  "like_type",  limit: 4, null: false
    t.datetime "created_at",           null: false
    t.datetime "updated_at",           null: false
  end

  create_table "users", force: :cascade do |t|
    t.string   "name",                     limit: 255,               null: false
    t.string   "email",                    limit: 255,               null: false
    t.datetime "created_at",                                         null: false
    t.datetime "updated_at",                                         null: false
  end

  create_table "products", force: :cascade do |t|
    t.string   "name",                limit: 255,   null: false
    t.text     "description",         limit: 65535, null: false
    t.datetime "created_at",                        null: false
    t.datetime "updated_at",                        null: false
  end

어소시에이션



models/user.rb
class User < ActiveRecord::Base
  has_many :likes
  has_many :like_products, through: :likes, source: :product
end

models/product.rb
class Product < ActiveRecord::Base
  has_many  :likes
  has_many :like_users, through: :likes, source: :user
end

models/like.rb
class Like < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
  enum like_type: [ :dislike, :like]
end

라우팅



이번에는 유저가 like한 product 일람을 표시하므로 다음과 같은 라우팅을 설정하고 있습니다.

routes.rb
  resources :users do
    member do
      get 'likes'
    end
  end

controller



controller.rb
  def likes
    @user = User.find(params[:id])
    @products = @user.like_products
  end

view로 액세스하는 방법



each 문을 중첩합니다. 자식 중첩에서 product.likes만으로하면 부모 중첩으로 얻은 products의 id를 가진 likes 테이블의 모든 레코드를 가져옵니다.
그 때문에 where로 취득하고 싶은 user를 좁히고 있습니다.

index.html.erb
<% @products.each do |product| %>
  <% product.likes.where(user_id: @user.id).each do |like| %>
    <%= product.name %>
    <%= like.like_type %>
  <% end %>
<% end %>

더 깔끔하게 쓰고 싶다



each 문을 중첩하고 더 잘 깨끗하게 쓰고 싶습니다. 다른 좋은 방법을 아시는 분이 계시다면 알려주세요!

좋은 웹페이지 즐겨찾기