[英]Rails Ransack - How to include multiple conditions with a 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的事件。
我嘗試了幾種不同的方法來解決此問題,但我無法使其正常工作,因此我認為目前尚無法實現。 您能否證實我的理論,或者讓我知道如果確實可能的話該如何實現?
作為參考,我嘗試了以下方法:
由於我很樂意使用現有的真實謂詞,因此我認為僅添加一個返回我想要的東西的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
我將代碼放在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.