2010-05-09 22 views
7

Ben bazı özel kategori ve sınıfta bağlantılıdır tüm mesajları listelemek istiyorum yoluyla.Raylar ilişkili tüm kayıtlar has_many bulmak 3:

Ben:

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 

Ve gerçekten de çok basit bir iştir bu

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

böyle bir şey yapmak istiyorum, ama aradığım gerektiğini bilmiyorum (anahtar kelimeler) .

O ancak rayların içinde, this gibi aynı problem.

EDIT: Soruya daha fazla ayrıntı ekledim. Bu, ancak her iki param da belirtilmişse çalışır. Cadı her zaman böyle değildir - Hangi paramların belirtileceğini bilmiyorum.

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

cevap

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

Ayrıca kılavuzların bakmak:

+0

, teşekkürler. Ama ya bir tane daha çok birliğe (Sınıflara diyelim ki) o Post'a ve eğer hem Kategori'ye hem de Classroom'a göre bulmak istiyorsam? Post.where gibi bir şey ([ "category.id = VE classroom.id =??" Params [: category_id], params [: classroom_id]]) – Sergey

+0

nasıl bu konuda: Post.where ([ "? Category_id =" , parametreler [: category_id]. [ "? classroom_id =", params [: classroom_id]]) burada() – Chap

+0

@chap Ben Mesaj tabloda bu alanları yok. Bu yüzden soruyorum.Lütfen soruyu okuyun. – Sergey

0

Sesler statment eğer bir ihtiyaç gibi. kullanılıp kullanılmayacağını gelince

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.joins(:category_posts, :classroom_posts) 
.where(
["category_posts.category_id = ? 
AND classroom_posts.classroom_id = ?", params[:category_id], params[:classroom_id]]) 

Bu gibi bir SQL traslate olacaktır:

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

Bunun işe gerektiğini düşünüyorum içeren veya bu answer de Post görünüm üzerinde katılır stackoverflow üzerinde.

post.rb yılında: o DBMS için daha fazla iş yapar ve bu gerekli değildir çünkü

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 

Ben Classroom veya Category katılmıyorsun İşte

4

Rails 3 yapacağını budur.

Şimdi, bunu yapabilirsiniz: Ben olsa test etmedim

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

. Gerekirse sormaktan çekinmeyin. işleri