Rails에서 연관된 모델을 기준으로 읽어들이기
하면, 만약, 만약...
나는 어떤 보도와 같은 유형의 보도를 찾고 싶다.
#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
Reference
이 문제에 관하여(Rails에서 연관된 모델을 기준으로 읽어들이기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shunwitter/items/b631b1078e0e1ef82986텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)