首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多选多选...有点

多选多选...有点
EN

Stack Overflow用户
提问于 2009-07-01 09:33:05
回答 2查看 518关注 0票数 1

这是我在Stack上的第一篇文章,如果我违反了任何协议,请容忍我。

我正在做一个Rails (2.1.2)的项目,我有一个关系场景,看起来像这样:

代码语言:javascript
复制
event [has_many] days

不同类别的人可以注册活动日,提供以下绑定结果:

代码语言:javascript
复制
category [has_many] customers [has_many] orders [has_many] days  
[belongs_to] event

现在,我想要一个客户的“事件”总数,或者某个类别的所有客户的“事件”总数,但我遇到了困难。AFAIK,没有办法在对象数组中执行简单的“查找”,对吗?那么,解决方案是什么呢?嵌套循环,以及按顺序从“天”中获取“事件”的collect方法?

如果我说不清楚,请告诉我。

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-01 13:24:50

我个人会使用MySQL语句来做这件事。我不确定,但我认为它比其他示例(使用rails提供的关联方法)要快得多。

这意味着在Customer模型中,您可以这样做:(请注意,我假设您使用的是默认的关联键:'model_name_id')

代码语言:javascript
复制
class Customer
  def events
    Event.find_by_sql("SELECT DISTINCT e.* FROM events e, days d, orders o, customers c WHERE c.id=o.customer_id AND o.id=d.order_id AND e.id=d.event_id")
  end
end

这将返回与用户相关的所有事件,并且没有重复的事件( 'DISTINCT‘关键字确保了这一点)。与上面的示例一样,您将丢失有关用户注册的确切日期的信息。如果你需要这些信息,请说出来。

此外,我还没有为您的Category模型添加示例,因为我假设您可以自己调整我的示例。如果没有,请让我知道。

编辑:

我刚读到你只是想数一下事件。使用count语句可以更快地完成这项工作(或者至少减少内存消耗)。要使用它,只需使用以下函数:

代码语言:javascript
复制
def event_count
  Event.count_by_sql(SELECT DISTINCT COUNT(e.*) FROM ... ... ...
end
票数 0
EN

Stack Overflow用户

发布于 2009-07-01 10:48:58

您的模型可能如下所示:

代码语言:javascript
复制
class Category
  has_many :customers

class Customer
  has_many :orders
  has_many :days, :through => :orders # I added this
  belongs_to :category

class Order
  has_many :days
  belongs_to :customer

class Day
  belongs_to :event
  belongs_to :order

class Event
  has_many :days

使用此选项,您可以为客户统计事件:

代码语言:javascript
复制
events = customer.days.count(:group => 'event_id')

它将像这样返回OrderedHash:

代码语言:javascript
复制
#<OrderedHash {1=>5, 2=>13, 3=>0}>

您可以通过以下方式获取事件计数:

代码语言:javascript
复制
events[event_id]

events[1] # => 5
events[2] # => 13
etc.

如果您想要uniq事件总数:

代码语言:javascript
复制
events.size # => 3

在对类别中所有客户的事件进行计数的情况下,我会这样做:

代码语言:javascript
复制
events = {}
category.customers.each {|c| events.merge!(c.days.count(:group => 'event_id') ) }
events.size # => 9 - it should be total number of events

但在这种情况下,您会丢失每个事件出现的次数的信息。

我没有测试这个,所以可能会有一些错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1068207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档