1

我正在使用数据表(http://datatables.net)构建一个rails 3.2应用程序,在大多数html表上进行客户端分页和过滤,在其他一些html表上进行服务器端分页和过滤。我想做每列过滤,这对于客户端表来说非常容易,但我认为我需要为数据库构造一个 sql 查询来对服务器端表进行每列过滤。我密切关注 RailsCast #340 on datatables 中的示例并使其正常工作。

挑战在于对与另一个表真正具有外键关系的列进行排序和过滤。我不想对 foreign_key 值的实际内容进行排序和过滤。我想对为链接对象显示的“.to_s”值进行排序和过滤(这是使用客户端排序和过滤功能的语义)。这是一个例子:

class Address < ActiveRecord::Base
  attr_accessible :city, :line1, :line2, :state, :zip

  has_many :people

  def to_s
    [line1, line2, city, state, zip].join(' ')
  end
end
class Person < ActiveRecord::Base
  attr_accessible :address, :name

  belongs_to :address
end

所以显示人员列表的视图有两列,分别是姓名和地址

<td><%= p.name %></td>
<td><%= p.address %></td>

并且出现在索引表中的是

John Smith |  1234 Main St Anywhere City AA 12345

因此,通过客户端排序和过滤,我可以在地址列中搜索“任何地方”,并在地址字段中获取包含该术语的所有行。在服务器端做同样的事情似乎要困难得多。我想我正在尝试组装一个看起来像这样的 sql 查询:

select * from people 
         join address on people.address_id = address.id
        where concat(address.line1, 
                     address.line2, 
                     address.city, 
                     address.state, 
                     address.zip) as spec_address like query_term 
     order by spec_address

(这不一定是正确的 SQL 代码。)

我已经查看了 ActiveRecord Query Rails 指南以及我在 Arel 上可以找到的任何内容,但均未成功。

4

1 回答 1

0

您可以使用一个范围来执行此操作,Address然后将其合并到Person查询中。

class Address < ActiveRecord::Base
  scope :anywhere, lambda{|search|
    attrs = [:line1, :line2, :city, :state, :zip]
    where(attrs.map{|attr| "addresses.#{attr} LIKE :search"}.join(' OR '), search: "#{search}%").
      order(*attrs) 
  }
end

Person.joins(:address).merge(Address.anywhere(query_term))
于 2013-05-30T03:43:04.267 回答