Rails에서 연관된 모델을 기준으로 읽어들이기

5131 단어 RubyRails
블로그를 업데이트했습니다원래 기사가 여기 있어요.
하면, 만약, 만약...
나는 어떤 보도와 같은 유형의 보도를 찾고 싶다.

#Postモデル
class Post < ActiveRecord::Base
    has_and_belongs_to_many :categories
end

#交差テーブル
class CategoriesPost < ActiveRecord::Base
end

#Categoryモデル
class Category < ActiveRecord::Base
    has_and_belongs_to_many :posts
end


post = Post.first
categories = Category.joins(:posts).where("posts.id = ?", post.id).select("categories.id")
category_ids = categories.map { |c| c.id }.join(',')

posts = Post.joins(:categories).where("categories.id IN (#{category_ids})").uniq

 
이렇게 하면 꺼낼 수 있지만 여러 카테고리를 가질 수 있는 설정이기 때문에 IN에서 하면 당연히 중복 보도가 된다.id=1의 보도는 13, 33, 36개의 종류가 있기 때문에 3차례에 걸쳐 id=1의 보도를 얻었다.
유닉스는 중복을 없앨 수 있지만 더 똑똑한 방법은 없을까.
SQL에 익숙한 사람에게 알려주세요.
나토르에게서 레퍼런스(*args)라는 편리한 방법을 배웠다.
Category ID는 직접 수집하지 않아도 됩니다.category_아이즈면 되겠네요.
언젠가 Rails 튜토리얼에서 봤어요.
인용

User.includes(:posts).where("posts.name = 'foo'")
# => Doesn't JOIN the posts table, resulting in an error.

User.includes(:posts).where("posts.name = 'foo'").references(:posts)
# => Query now knows the string references posts, so adds a JOIN


post = Post.first
posts = Post.includes(:categories).where(categories_posts: {category_id: post.category_ids}).references(:categories)

http://api.rubyonrails.org

좋은 웹페이지 즐겨찾기