簡體   English   中英

Rails 3找到所有相關記錄has_many:through

[英]Rails 3 find all associated records has_many :through

我想列出與某個特定類別和課堂相關的所有帖子。

我有:

class Post < ActiveRecord::Base
  has_many :category_posts
  has_many :categories, :through => :category_posts
  has_many :classroom_posts
  has_many :classrooms, :through => :classroom_posts
end

class Category < ActiveRecord::Base
  has_many :category_posts
  has_many :posts, :through => :category_posts
end

class CategoryPost < ActiveRecord::Base
  belongs_to :category
  belongs_to :post
end

class Classroom < ActiveRecord::Base
  has_many :classroom_posts
  has_many :posts, :through => :classroom_posts
end

class ClassroomPost < ActiveRecord::Base
  belongs_to :classroom
  belongs_to :post
end

我想做這樣的事情

Post.where(["category.id = ? AND classroom.id = ?", params[:category_id], params[:classroom_id]])

這確實是非常簡單的任務,但我不知道我應該尋找什么(關鍵字)。

這就像同樣的問題, 這個 ,但是在軌道上。

編輯 :我在問題中添加了更多細節。 這有效,但前提是我指定了兩個參數。 女巫並非總是如此 - 我不知道會指定什么樣的參數。

Post.joins(:categories, :classrooms).where(["categories.id = ? AND classrooms.id = ?", params[:classroom_id], params[:category_id]])
Category.find(params[:category_id]).posts

另請查看指南:

這是我在Rails 3中要做的:

post.rb

def self.in_category(category_id)
  if category_id.present?
    join(:category_posts).where(category_posts: {category_id: category_id})
  else
    self
  end
end

def self.in_classroom(classroom_id)
  if classroom_id.present?
    join(:classroom_posts).where(classroom_posts: {classroom_id: category_id})
  else
    self
  end
end

我不加入ClassroomCategory因為它為DBMS做了更多的工作,這不是必需的。

現在,您可以:

Post.in_category(params[:category_id]).in_classroom(params[:classroom_id])

我沒有測試過它。 因此,如果需要,請不要猶豫。

我認為應該有效:

Post.joins(:category_posts, :classroom_posts)
.where(
["category_posts.category_id = ? 
AND classroom_posts.classroom_id = ?", params[:category_id], params[:classroom_id]])

這將轉換為SQL,如:

SELECT 
    p.*
FROM
    posts AS p
        INNER JOIN
    category_posts AS cap ON cap.id = p.category_posts_id
        INNER JOIN
    classroom_posts AS clp ON clpid = p.classroom_posts_id
WHERE
    cap.category_id = '1' AND clp.classroom_id = '1'
;

至於是否使用:include或join on Post在stackoverflow上查看這個答案

聽起來你需要一個if語句。

if params[:category_id] && params[:classroom_id]
  Post.joins(:categories, :classrooms).where("classrooms.id" => params[:classroom_id], "categories.id" => params[:category_id]])
elsif params[:category_id]
  Category.find(params[:category_id]).posts
else
  Classroom.find(params[:classroom_id]).posts
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM