簡體   English   中英

Rails作用域上的Emirates_to關聯

[英]Rails scope on belongs_to association

想象一本書和一個章節模型。 has_many :chaptersbelongs_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM