簡體   English   中英

如何通過多個值過濾模型字段(或)

[英]How to filter a models field by multiple values (OR'd)

我有一個模型說Book ,它具有以下作用域函數:

scope :author, lambda { |author|
    return where(nil) unless author.present?
    joins(:author).where('author.id' => author)
  }

這樣可以僅使用一個作者值來過濾“書籍”。 我想做的是從JavaScript文件(例如["harry", "doyle", "alex", "parrish"]的作者列表中傳遞了一個數組["harry", "doyle", "alex", "parrish"] ,我希望能夠找到具有這些作者中任何一位的所有書籍(因此請在此處進行OR查詢)。 請注意,每本書可以有多位作者。

我嘗試了以下功能,但它只是給我所有的書,而不是如上所述的正確過濾。

scope :authors_multiple, lambda { |authors|
  @results = Book
  authors.each do |auth|
    @results = @results.author(auth)
  end
  return @results
}

示范作者(摘錄):

class Author < ApplicationRecord
  has_and_belongs_to_many :books, uniq: true
  ....

樣書(摘錄):

class Book < ApplicationRecord
  has_and_belongs_to_many :authors, uniq: true
  ....

您能否幫助我了解我做錯了什么或做錯了什么正確方法。 提前致謝。

authors = ["harry", "doyle", "alex", "parrish"]  
Book.where(author: authors)

要么

authors = ["harry", "doyle", "alex", "parrish"]  
auths = Author.where(name: authors)
Book.where(author: auths)

假設作者有很多書。 您可以在此處了解有關模型關聯的更多信息: https : //guides.rubyonrails.org/association_basics.html

首先,您需要獲取Author記錄。 如何完成此操作取決於您的架構和數據,但這將類似於:

author_names = ["harry", "doyle", "alex", "parrish"]

然后執行以下操作之一:

authors = Author.where(name: author_names)
authors = Author.where("name ILIKE ANY ( array[?] )", author_names.map { |name| "%#{name}%" })

使我們得到需要的作者的ActiveRecord::Relation的東西。 一旦我們有了作者,我們可以將其與我們的書合並以獲得我們想要的所有書:

books = Book.joins(:authors).merge(authors)

請注意,連接是在多作者 Rails將知道通過連接表(默認情況下應該為authors_books )連接到authors表。

您會得到一系列的作者姓名,對不對?

scope :by_author, lambda { |names|
  # if you have a chance to get blank values you need to reject them
  names.reject!(&:blank?) if names.is_a? Array

  joins(:authors).where(authors: { name: names }).distinct if names.present?
}

它應該與數組或字符串參數一起正常工作

Book.by_author(["harry", "doyle"])
Book.by_author("harry")

嘗試以下代碼:

authors = ["harry", "doyle", "alex", "parrish"]    
Book.joins(:authors).where(:authors => {:name => authors})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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