【问题标题】:Rails Sorting on a value coming from two columnsRails对来自两列的值进行排序
【发布时间】:2013-03-12 10:02:31
【问题描述】:

我有两个表,A 和 B。A 和 B 有一个外键。两者都是 ActiveRecord。

class A
  has_one :b
  def valueRendered
    b.value1 || b.value2
  end
end

class B
  ( belongs_to :a, :foreign_key => :keyb ) if self.b
end

这里来自 A 中的 valueRendered 方法的值在 value1 为空时具有来自 B 的字段 value2 的值。我必须使用 valueRendered 对表进行排序,即表应该根据 value1 和 value2 的值进行排序。如何进行?

编辑: 更具体地说,假设有一个计算列(rails 中的一种方法)具有来自字段“value1”的值,但如果 value1 为空,则该值来自“value2”。我想针对这个计算字段(方法)对整个表(不限于任何特定的记录或范围)进行排序。我很困惑如何继续。

更多编辑:实际示例代码

在控制器中,

  sort_fields = ['offer_orders.id','offers.name','offer_orders.created_at',  
  'offer_orders.country', 'offer_orders.ip_address',       
  'fraud_score_daily.adjusted_fraud_probability, fraud_score_daily.fraud_probability',                    
  'players.email','players.account_status',
  nil,
  nil,
  nil, 
  nil 
  ]

  arel = OfferOrder.includes(:offer, :player, :fraud_score_daily).group('fraud_score_daily.offer_order_id').order('dt desc')
  arel = paginate_table_data(arel, :sort_fields => sort_fields)

paginate_table_data 方法在帮助器中

def paginate_table_data(arel, opts={})
  opts.assert_keys(:required => [:sort_fields])
  @page_size = page_size
  @current_page = current_page
  arel.paginate(:page => @current_page, :per_page => params[:iDisplayLength]).
  order(order_by(opts[:sort_fields]).join(', '))
end

【问题讨论】:

  • 嗨!我不明白你所说的“应该根据 value1 和 value2 的值进行排序”的意思。您的意思是只显示关联的 B 具有两个值的 A 记录吗?还是根据 B 值对 A 记录进行排序?
  • 我已经更新了这个问题。看看它是否澄清。
  • 您不能在 sql 查询中使用 rails 中声明的方法。您可以实现的最接近的事情是下面的cheeseweasel回答:)
  • 这需要在模型 A 中声明它,但这样做无济于事,因为在运行时选择了订单方向 (ASC|DESC)。此外,代码已经优化为具有类似的查询,但似乎没有帮助。
  • 您始终可以使用 lambda 或类方法传递动态订单。给出具体代码而不是一些伪代码,以便我们了解您的要求。

标签: mysql ruby-on-rails model-associations


【解决方案1】:

怎么样:

scope :order_by_value_rendered, joins(:b).order("value1, value2")

【讨论】:

  • 顺序没有帮助,因为 asc 或 desc 是有选择性的。我已经试过了。
  • 抱歉,英语不是我的母语。 asc or desc is selective 是什么意思?
  • 选择性是指在运行时选择升序或降序。
  • 我在做急切加载时在想,如果生成了一个可用于排序的计算字段。可能吗?我有arel = A.includes(:b)。可以在这里做任何事情有一个计算字段吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多