2010-09-12 49 views
5

Tôi có 2 kiểu: ghi chú và thẻ.Rails ActiveRecord: HABTM tìm các tham số

class Note < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :notes 
end 

Thẻ có tên (ví dụ: "rss", "javascript", v.v ...). Cách tốt nhất để truy xuất tất cả các ghi chú có danh sách thẻ nhất định là gì? Tức là, tôi muốn có một tuyến đường được đặt tên như /notes/with_tags/rss,javascript và cần một phương thức lớp học trên Ghi chú được gọi là find_with_tags().

Vì vậy, làm thế nào để làm điều này:

class Note 
    def self.find_with_tags(tags) 
    ????? 
    end 
end 

Tôi hiện đang sử dụng Tag.find_all_by_name(['xml','rss']).map(&:notes).flatten.uniq, nhưng tôi nghĩ đó có phải là một cách tốt hơn

+0

thế nào về việc sử dụng hành vi-as-taggable-on plugin/đá quý? – Eimantas

+0

Cảm ơn, tôi đã thấy điều đó. Tôi đã tự hỏi nhiều hơn về cơ chế của cách bạn muốn làm một cái gì đó như thế. –

Trả lời

3

Cuối cùng, đây là những gì tôi đã được tìm kiếm:

Note.find(:all, :include=>:tags, :conditions => ['tags.name in (?)',['rss','xml']]) 
1

Bạn cũng có thể làm được điều này (mặc dù tôi không thực sự là một fan hâm mộ lớn viết sql trong các truy vấn), cũng sẽ trả về tất cả các ghi chú với một trong các thẻ được cung cấp.

class Note < ActiveRecord::Base 
    has_many :notes_tags 
    has_many :tags, :through => :notes_tags 

    def self.find_with_tags(*tags) 
    all(:joins => :notes_tags, :conditions => ["notes_tags.tag_id in (select id from tags where name in (?))", tags], :group => 'notes.id') 
    end 

end 
Các vấn đề liên quan