如何加入哈希

时间:2014-06-25 00:55:23

标签: ruby-on-rails

嗨,我想达到这样的目的:

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的方式。有什么建议吗?

3 个答案:

答案 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}}将使用联接来捕获所有活动,只生成一个查询。显然,您的数据模型可能看起来不完全如此,但这是它的一般要点。