[英]Rails scope on belongs_to association
想象一本書和一個章節模型。 has_many :chapters
都belongs_to :book
,一本書has_many :chapters
。 我們在章節中具有作用域,例如:very_long
返回包含300頁以上的章節。
很多時候,我們希望所有章節的書籍都超過300頁。 我們通常實現此目標的方式如下:
# book.rb
scope :has_very_long_chapter, -> { where(id: Chapter.very_long.select(:book_id) }
但是,正如您可以想象的那樣,每次我們要按章范圍過濾Book時,代理范圍都會很繁瑣。 還有其他慣用的或更清潔的方式來實現這一目標嗎?
要獲取這些書,您可以使用ActiveRecord::SpawnMethods#merge
,而不必使用其他范圍:
Book.joins(:chapters).merge(Chapter.very_long)
我認為您可以做的一件事就是使用joins/merge
class Book < ARBase
scope :with_long_chapters, ->{ joins(:chapter).merge(Chapter.very_long) }
end
class Chapter < ARBase
scope :very_long, -> { logic for querying chapters with over 300 pages }
end
編輯(#2):更可重用的作用域
class Book < ARBase
scope :by_chapter_page_count, ->(pages){ joins(:chapter).merge(Chapter.by_page_count pages) }
scope :with_climax, -> { joins(:chapter).merge(Chapter.by_category :climax) }
scope :long_with_climax, -> { by_chapter_page_count(400).with_climax }
end
class Chapter < ARBase
scope :by_page_count, ->(pages) { where("pages > ?", pages }
scope :by_category, ->(category) { where category: category }
end
Book.by_chapter_page_count(100)
您可以在如何編寫范圍方面變得相當有創意
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.