【问题标题】:Using Ransack to sort attributes for parent of parent使用 Ransack 对 parent 的 parent 的属性进行排序
【发布时间】:2014-07-06 06:16:42
【问题描述】:

我知道如何对父属性使用 Ransack 很棒的 sort_link 方法,但是当我将相同的逻辑外推到祖父属性的属性时,它不起作用(我可以点击链接,只是没有排序)。

层次结构是这样的:Signup has_many Request has_many Transaction。我正在从 Transaction 的角度进行搜索。

控制器代码:

def index
  @q = Transaction.ransack(params[:q])
  @transactions = @q.result.includes(:request => :signup)
end

查看代码:

<th><%= sort_link(@q, 'requests.signup.email', "Email") %></th>
<th><%= sort_link(@q, 'requests.pickupdate', "Pick up date") %></th>
<th><%= sort_link(@q, 'requests.returndate', "Returndate") %></th>

顺便说一句,搜索代码(例如,:request_returndate_eq)很好,只是排序不起作用。

型号代码:

class Signup < ActiveRecord::Base
  has_many :requests
end

class Request < ActiveRecord::Base
  belongs_to :signup
  has_many :transactions, dependent: :destroy
end

class Transaction < ActiveRecord::Base
  belongs_to :request
end

控制台输出

第一次点击以升序排序(尽管每次点击它总是产生 200 响应,即使视图实际上并没有改变)

Started GET "/admin/transactions?q%5Bs%5D=requests.signups.email+asc" for 127.0.0.1 at 2014-07-07 13:40:16 -0700
  Processing by TransactionsController#index as HTML
    Parameters: {"q"=>{"s"=>"requests.signups.email asc"}}
    Rendered layouts/_flash.html.erb (0.6ms)
      (0.4ms)  SELECT "transactions"."name" FROM "transactions"
    Transaction Load (0.6ms)  SELECT "transactions".* FROM "transactions"
    Request Load (0.3ms)  SELECT "requests".* FROM "requests"  WHERE "requests"."id" IN (11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50)
    Signup Load (0.1ms)  SELECT "signups".* FROM "signups"  WHERE "signups"."id" IN (4, 5, 1, 2)
  Rendered transactions/index.html.erb within layouts/application (74.3ms)
Completed 200 OK in 85ms (Views: 81.7ms | ActiveRecord: 1.4ms)

【问题讨论】:

  • 你可以试试'requests.signups.email'看看会发生什么。
  • 忘了说我试过了,也不管用。顺便说一句,requests.pickupdaterequests.returndate 甚至都不工作
  • 能否请您发布您的模型定义。他们三个。
  • 代替includes试试joins
  • No也不行

标签: ruby-on-rails ruby-on-rails-4 ransack


【解决方案1】:

您可以使用delegate 避免在视图中显示父或父表达式。

型号

class Transaction < ActiveRecord::Base
  belongs_to :request
  delegate :email, to: :request, prefix: true
end

交易查看代码:

<th><%= sort_link(@q, 'request_email', "Email") %></th>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多