簡體   English   中英

has_many通過關聯和多個搜索條件,我該如何進行這項工作?

[英]has_many through association, and multiple search criteria, how can i make this work?

我正在嘗試創建一個多條件搜索表單。 我想通過GET提交所有搜索內容,如果它們分配了值,我希望對它們進行評估。 我遇到的麻煩是要構建一個查詢,當您使用“通過”關聯進行查詢時,它將允許我在頂部放置更多查詢。

只是讓您了解我的模型是如何設置的:

class Client < ActiveRecord::Base
  has_many :campaigns
  has_many :pieces, :through => :campaigns
end

class Campaign < ActiveRecord::Base
  belongs_to :client
  has_many :pieces
end

class Piece < ActiveRecord::Base
  belongs_to :client
end

現在,考慮到該模型,我正在使用collect方法來抓取具有共同組織的部分。

if params.has_key?(:criteria)
    @selected_client = Client.where(:organization => "Org1")
    @pieces = @selected_client.collect{ |c| c.pieces }.flatten
end

有什么方法可以格式化該查詢字符串,以便我可以將@pieces縮小兩次。 假設我想通過關聯再次使用它,以獲得具有其他相同客戶標准的作品...

萬分感謝! 此時我的大腦是椒鹽脆餅。

我不確定我是否很好理解您的意圖。 如果您想獲得所有符合客戶標准的作品,請在rails 3中執行以下操作:

@pieces = Piece.joins(:campaign => :client).where(:clients => {:organization => criteria})

從組織“ Org1”獲取屬於客戶的所有作品。

如@Andrew所說,您可以堆疊要添加新條件的where語句。 請參閱此以獲得更多信息

您的第一段被截斷,僅供參考。

如果@pieces是數組,則可以使用find塊進一步縮小搜索范圍。 盡管這會將負載放在服務器CPU而非SQL數據庫上。

您可以where語句和Rails會自動為您創建單個查詢的where堆疊。 以下是我們網站的“應用商店”部分中的一些示例代碼:

@platform = params[:platform]
@category = params[:category]
@search   = params[:app_q]

# Get initial SQL, narrow the search, and finally paginate
@apps = App.live

@apps = @apps.where("platform = ?", AppPlatforms.value(@platform)) if AppPlatforms.value(@platform)
@apps = @apps.where("(name LIKE ? OR description LIKE ?)", "%#{@search}%", "%#{@search}%") if @search
@apps = @apps.where("id IN(?)", @cat.apps) if @category && @cat = Category.find_by_id(@category)

@apps = @apps.paginate(:page => params[:page], :per_page => 10, :order => "name")

您應該可以使用@selected_client.pieces.where(...)而不是使用collect來通過SQL縮小搜索范圍。

我希望這是朝正確方向邁出的一步!

暫無
暫無

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

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