嗨,我想达到这样的目的:
feeds = []
following_companies.each do |follow|
feeds = feeds + Activities.where(:company_id => follow.company_id).order("created_at DESC").limit(5)
end
feeds = feeds.order("created_at DESC")
到此为止,我使用feeds = feeds.order("created_at DESC")
,feeds
一个数组,并抛出一个异常undefined method order for #<Array:0x007f78032e2458>
。只要我知道where
子句返回一个哈希(或一个ActiveRecord列表,如果我错了,请纠正我)。我认为问题是我初始化feeds
的方式。有什么建议吗?
答案 0 :(得分:1)
当你在where子句的末尾抛出限制时,它返回一个数组而不是Arel。您可以对数组进行排序,而不是使用arel方法order
。
feeds = feeds.sort{|f| f.created_at }
<强>更新强> 如果以下公司仍然是您可以进行的查询
company_ids = following_companies.pluck(:company_id)
如果是数组,您可以执行此操作以获取所有company_ids
company_ids = following_companies.map {|u| u.location_id }
对于所有
的Feed,您可以进行一次查询,而不是循环查询Activities.where(company_id: company_ids).order("created_at DESC")
我不确定如何将每个id限制为5。
答案 1 :(得分:1)
feeds.sort_by(&:created_at).reverse
将在您使用循环构建它之后直接在Feed上执行此操作,但您需要首先更有效地执行此操作。
答案 2 :(得分:1)
如果你有相当多的关注公司,你上面所做的事情会产生大量的疑问。我不确定你的模特是什么样的,但我能从上面收集到的是这样的:
class User < ActiveRecord::Base
has_many :companies
end
class Company < ActiveRecord::Base
has_many :activities
end
class Activity < ActiveRecord::Base
belongs_to :company
end
您应该能够在User上添加关系,以便您一次查询所有活动。您的用户模型需要这样的内容:
class User < ActiveRecord::Base
has_many :companies
has_many :activities, through: :companies
end
然后,您可以通过执行user.activities
来收集您的活动,{{1}}将使用联接来捕获所有活动,只生成一个查询。显然,您的数据模型可能看起来不完全如此,但这是它的一般要点。