2009-03-28 15 views
5

Có cách nào để háo hức tải một named_scope từ một hiệp hội không?Trình tải một tên được đặt tên từ một liên kết trong Rails

tôi có mô hình Điều tôi:

class Article < ActiveRecord::Base 
    has_many :comments 
end 

và mô hình luận của tôi:

class Comment < ActiveRecord::Base 
    belongs_to :article 

    named_scope :approved, :conditions => { :approved => true } 
    named_scope :unapproved, :conditions => { :approved => false } 
end 

tôi có thể tải háo hức tất cả bình luận cho một bài viết với:

@article = Article.find(params[:id], :include => :comments) 

Làm thế nào tôi có thể làm như vậy, nhưng chỉ cho ý kiến ​​được phê duyệt?

Trả lời

3

Nó không phải được xây dựng-in để vịn vào lúc này, nhưng Ryan Daigle tạo một plugin gọi utility_scopes có thêm một với() Phạm vi, do đó bạn có thể làm:

Article.approved.with(:comments) 

Blog Post: http://ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know Github repo: http://github.com/yfactorial/utility_scopes

[Cập nhật mỗi lời bình]

Tệ của tôi. Tôi đã không đọc đủ tốt. Tôi không nghĩ rằng có bất cứ điều gì mà sẽ cho phép bạn gọi vào một hiệp hội named_scope như thế. Điều gần nhất tôi có thể nghĩ đến là tạo một named_scope trên Bài viết:

class Article < ActiveRecord::Base 
    named_scope :with_approved_comments, {:include => :comments, :conditions => ['comments.approved = ?', true]} 
end 

Hy vọng điều này sẽ hữu ích.

+0

Nếu tôi hiểu bài đăng trên blog chính xác, điều đó sẽ cho tôi các bài viết có phạm vi với tất cả các nhận xét của họ. Nó tương đương với: Article.approved.all (: include =>: comments). Những gì tôi đã tìm kiếm đã được scoping các ý kiến, để mỗi bài viết chỉ háo hức tải ý kiến ​​được phê duyệt của nó, không phải tất cả trong số họ. –

1

Câu trả lời khác không phù hợp với tôi vì tôi phải tải nhiều liên kết và liên kết của các liên kết đó trên một số kiểu máy. Tôi thấy tôi có hai lựa chọn, thay đổi liên kết để có điều kiện và do đó tạo một liên kết cho mỗi phạm vi tôi muốn hoặc biến chúng thành các phương thức trên lớp có liên kết has_many. Tôi cần phải làm một cái gì đó dọc theo dòng:

@newspaper = Newspaper.find params[:id], :include => { 
    :articles => { 
    :author => true, 
    :source => true 
    } 
} 

Vì vậy, trong ví dụ của tôi, tôi đã thay đổi:

class Newspaper < ActiveRecord::Base 
    has_many :articles 
end 

class Article 
    belongs_to :newspaper 
    belongs_to :author 
    has_one :source 

    named_scope :private, :conditions => { :private => true } 
    named_scope :public, :conditions => { :private => false } 
end 

tới:

class Newspaper < ActiveRecord::Base 
    has_many :articles 

    def articles_public 
    articles.reject &:private 
    end 

    def articles_private 
    articles.select &:private 
    end 
end 

class Article 
    belongs_to :newspaper 
    belongs_to :author 
    has_one :source 
end 

tôi thấy cách này là thích hợp hơn kể từ khi tôi có thể hiện đang háo hức tải bài báo khi tìm một tờ báo và chỉ cần thay đổi tất cả article.private thành article_private. Tôi đã tạo hai liên kết như:

has_many :articles_private, :class_name => 'Article', :conditions {:private => true} 
has_many :articles_public, :class_name => 'Article', :conditions {:private => false} 

Tôi sẽ phải háo hức tải chúng cả trong trường hợp tôi cần tất cả các bài viết liên quan.

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