簡體   English   中英

Ransacker謂詞用於多個關聯

[英]Ransacker predicate for multiple associations

我有一種情況,我有一個稱為事件的模型:* has_one primary_day * has_one backup_day * has_one Emergency_day

在每個has_one關聯中,有一組相同的布爾字段,例如,approved_legal,approved_malfunction,approved_costs等

在我的搜索表中-我不想在每個關聯中分別搜索相同的字段。

例如,我不想這樣做:

<%= f.check_box :primary_day_approved_legal_true %>

對於每個字段,因為它太冗長,所以我想這樣做:

<%= f.check_box :approved_legal_true %> 

它將整理所有關聯,並在所有has_one關聯中返回具有roved_legal true的事件。

我嘗試了幾種不同的方法來解決此問題,但我無法使其正常工作,因此我認為目前尚無法實現。 您能否證實我的理論,或者讓我知道如果確實可能的話該如何實現?

作為參考,我嘗試了以下方法:

1.事件模型中的自定義洗劫者

由於我很樂意使用現有的真實謂詞,因此我認為僅添加一個返回我想要的東西的ransacker就是可能的。 但似乎不是

ransacker :created_at do |parent|
  Arel.sql('select * from events inner join on primary_days .......')
end

這個搶劫犯似乎總是從添加了模型的模型開始。 所以我不能使用聯接的關聯。 看來,搶劫犯必須在與其相關的模型上返回一個現有的數據庫列。 因此,出於同樣的原因,沒有我可以提出的Arel代碼,這將使這種方法有效。 盡管嘗試創建一個Arel表來表示關聯,然后嘗試在arel中進行聯接-但結果始終相同-ArelSelectManager上沒有這樣的方法eq。

例如

ransacker :created_at do |parent|
  primary_days = Arel::Table.new(:primary_days)
  events = parent.table
  events.join(primary_days).on(events[:id].eq(primary_days[:event_id]))
end

2.將命名范圍與補丁一起用於問題61中發現的范圍-https: //gist.github.com/RohanM/5350768

我將代碼放在initializers / ransack.rb中,然后:

模型:

scope_ransackable :approved_legal
scope :approved_legal_scope, -> { 
  Event.joins(:primary_day).where(:primary_days: {approved_legal: true}) 
}

控制者

Event.search_with_scopes(params[q])

視圖

<%= f.check_box(:approved_legal_scope)%>

但這只是導致一個錯誤,指出在Ransack Search對象上未找到roveded_legal_scope方法

任何朝着正確方向的指針將不勝感激。 謝謝。

我已經通過使用Pre-Rails 5 hack的鏈接范圍實現了這一目標。

scope :short_search_scope, ->(search) {
   joins(:something)
  .where(
    unscoped.one_scope(search)
     .another_scope(search)
     .where_values.join(' OR '))
}

scope :one_scope, -> (search) {
  where(approved_legal: true)
}

...

def self.ransackable_scopes(auth_object = nil)
  [:short_search_scope]
end

在Rails 5中發布此功能時where().or.where()可以將where_values.join(' OR ')替換為where().or.where()

暫無
暫無

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

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