如何按时在轨道中订购多个ActiveRecords?

时间:2016-05-30 19:55:11

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

在我的控制器中,我需要添加像||这样的逻辑运算符和&&在我的但它没有工作,所以我认为我会更容易为每个变量创建自己的条件,然后对它们进行排序,就好像它们是使用created_at DESC一样。

@postActivity = PublicActivity::Activity.order("created_at DESC").where( owner_id: current_user.following.ids, key: 'posting' ).limit(20).all
@commentActivity = PublicActivity::Activity.order("created_at DESC").where( key: 'commenting' ).limit(20).all

条件比上述条件复杂得多。 如果你能指出一种不同的方式那么肯定,欣赏。 PS。我是一个红宝石新手..

2 个答案:

答案 0 :(得分:2)

对于特定样本,条件乘以(和),您可以使用ActiveRecord范围 - here

它们的目的是命名您在代码中很好地组合的查询条件。将范围添加到模型中,即从ActiveRecord :: Base

继承的类
class Activity < ActiveRecord::Base
  scope :ordered, -> { order(created_at: :desc) }
  scope :commenting, -> { where(key: 'commenting') }
  scope :limit, -> { limit(20) }
..

然后结合范围(和条件),你只是通道

Activity.ordered.commenting.limit...

同时,默认包含的内容有一个default_scope(例如,按顺序排列)

对于或条件(smt或smt)它更复杂 - 您似乎使用Arel.table(在ActiveRecord中) - 请参阅here例如

答案 1 :(得分:1)

ANDs和OR在控制器中工作,你的意思是你的控制器中的查询?如果您尝试执行复杂的SQL查询,则可以绕过活动记录以在原始SQL中执行查询。使用rails find_by_sql方法,如下所示:http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql