2010-05-09 13 views
7

Me gustaría enumerar todas las publicaciones que están conectadas con una categoría específica y un aula.Rails 3 encuentra todos los registros asociados has_many: a través de

tengo:

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 

Y quiero hacer algo como esto

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

De hecho, es tarea muy simple, pero no sé lo que debería estar buscando (palabras clave) .

Es el mismo problema que this, pero en los rieles.

EDIT: He añadido más detalles a la pregunta. Esto funciona, pero solo si tengo ambos parámetros especificados. La bruja no siempre es el caso, no sé qué parametros se especificarían.

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

Respuesta

4
Category.find(params[:category_id]).posts 

también echar un vistazo a las guías:

+0

Eso funciona, gracias. Pero, ¿qué sucede si tengo una asociación más de muchos a muchos (digamos aulas) para esa publicación y quiero encontrar ambas por categoría y por aula? Algo así como Post.where (["category.id =? AND classroom.id =?", Params [: category_id], params [: classroom_id]]) – Sergey

+0

¿Qué tal esto: Post.where (["category_id =?" , params [: category_id]). where (["classroom_id =?", params [: classroom_id]]) – Chap

+0

@chap No tengo esos campos en la tabla Publicar. Es por eso que estoy preguntando.Por favor lea la pregunta. – Sergey

0

Suena como si usted necesita un DECLARACIÓN.

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 
2

creo que debería funcionar:

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

Esto le Traslate a un SQL como:

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

En cuanto a si se debe utilizar: incluir o se une en Post vistazo a este answer en stackoverflow.

4

Esto es lo que yo haría en Rails 3:

En 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 

no unirse a Classroom o Category ya que hace más trabajo para los DBMS y esto no es necesario.

Ahora, usted puede hacer:

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

Yo no lo he probado sin embargo. Así que no dude en preguntar si es necesario.

Cuestiones relacionadas