【问题标题】:How can I perform a map-like function but still be able to use active record methods?如何执行类似地图的功能,但仍然能够使用活动记录方法?
【发布时间】:2012-07-20 16:26:48
【问题描述】:

我在使用地图的地方有以下几点:

last_activities = report.deals.map do |deal|
  deal.activities.last
end

然后我希望能够在“last_activities”上使用“where”,但我不能这样做,因为 last_activities 是一个数组。我想做但不能做的是:

fun_activities = last_activities.where(:type => "fun")

如何在 Rails 中完成此任务?

更新:

报告 has_many 交易
交易属于_to 报告
交易有_many活动
活动belongs_to deal

【问题讨论】:

  • 报告、交易和活动之间有什么关系?
  • 拒绝和选择有什么问题?这么简单的情况为什么需要 SQL 语句?
  • 我不需要SQL语句;只是想说明我想要实现的目标。你会建议拒绝并选择?
  • 如果最后一个是另一种类型,你不想要那些“有趣”的。或者您确实希望每个类型的最后一个有趣?
  • 仅查看与交易相关的最后活动,并从中选择 fun 类型的活动。

标签: ruby-on-rails arrays activerecord


【解决方案1】:

有两种方法可以实现:

1) 继续使用数组。也就是说,使用 select 选择有趣的活动: fun_activities = last_activities.select { |a| a.type == "有趣"}

2) 定义一个 SQL 语句,直接选择您想要的活动或尝试使用 ActiveRecord 查询来实现相同的活动 - 这将具有更好的性能或不将所有内容加载到数组中的优势。

【讨论】:

    【解决方案2】:

    如果他们很少,您可以按照 cmets 中的说明进行映射和选择

    all_last_activities = report.deals.map do |deal|
      deal.activities.last
    end
    
    fun_last_activities = all_last_activities.select do |act|
      act.type == "fun"
    end
    

    如果有很多记录,你最好用这样的查询来做

    all_last_activities_ids = report.deals.map do |deal|
      deal.activities.last.id
    end
    
    Activity.where(type: "fun").find(all_last_activities_ids)
    

    您还应该从查询中获得all_last_activities_ids,但我现在没有时间了解如何去做。但是组子句应该会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您想使用 AR/SQL 查询,请按以下步骤操作:

      Activity.joins(:deal).where(['deals.report_id = ? and activities.id in (select max(id) from activities group by deal_id)'], report.id)
      

      这将允许像您在原始问题中想要的那样链接条件。 然而,为了简单和可读性,您可能更喜欢选择/拒绝方法。

      【讨论】:

        【解决方案4】:

        使用squeel 可以很容易地在 ruby​​ 中表达这一点,而无需编写原始 SQL 查询:

        max_ids_rel = Activity.group{deal_id}.select{max(id)}
        
        Activity.joins{deal}.where{(deal.report_id == my{report.id}) && id.in(max_ids_rel)}
        

        这应该会生成一个类似于 HargrrimmTheBleak 建议的子选择。与生成的表进行连接也是可能的,但这需要更多的分组语句并且不是必需的,因为一个好的查询分析器应该能够将其转换为连接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-24
          • 2016-02-06
          • 2013-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多