我想列出与某个特定类别和课堂相关的所有帖子。
我有:
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相同,但在rails中。
修改: 我在这个问题上添加了更多细节。 这有效,但前提是我指定了两个参数。女巫并非总是如此 - 我不知道会指定什么样的参数。
Post.joins(:categories, :classrooms).where(["categories.id = ? AND classrooms.id = ?", params[:classroom_id], params[:category_id]])
答案 0 :(得分:4)
答案 1 :(得分:4)
以下是我在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
,因为它为DBMS做了更多工作,这不是必需的。
现在,你可以这样做:
Post.in_category(params[:category_id]).in_classroom(params[:classroom_id])
我还没有测试过它。因此,如果需要,请不要犹豫。
答案 2 :(得分:2)
我认为应该有效:
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
上包含或加入,请在stackoverflow上查看此answer。
答案 3 :(得分:0)
听起来你需要一个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