Rails에서 중간 테이블의 외래 키 이외에 갖게 한 열에 view로 액세스하는 방법
likes 테이블의 외래 키는 이번 경우
user_id
와 product_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 문을 중첩하고 더 잘 깨끗하게 쓰고 싶습니다. 다른 좋은 방법을 아시는 분이 계시다면 알려주세요!
Reference
이 문제에 관하여(Rails에서 중간 테이블의 외래 키 이외에 갖게 한 열에 view로 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ihatov08/items/adada13c7e24b7bee401텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)