代码之家  ›  专栏  ›  技术社区  ›  Sergey

rails3找到所有相关的记录有很多:通过

  •  7
  • Sergey  · 技术社区  · 15 年前

    我想列出所有与特定类别和课堂有关的帖子。

    我有:

    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]])
    

    这确实是一个非常简单的任务,但我不知道我应该找什么(关键字)。

    问题是一样的 this ,但在轨道上。

    编辑 : 我给这个问题增加了更多细节。

    Post.joins(:categories, :classrooms).where(["categories.id = ? AND classrooms.id = ?", params[:classroom_id], params[:category_id]])
    
    4 回复  |  直到 8 年前
        1
  •  4
  •   yfeldblum    15 年前
    Category.find(params[:category_id]).posts
    

        2
  •  4
  •   jbescoyez    11 年前

    下面是我在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
    

    我不参加 Classroom Category

    现在,您可以:

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

    不过我还没有测试过。所以如果需要的话,不要犹豫。

        3
  •  2
  •   Community CDub    8 年前

    我认为这应该行得通:

    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'
    ;
    

    Post answer 在stackoverflow上。

        4
  •  0
  •   Dan Healy    14 年前

    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
    
    推荐文章