假設basic_events
和additional_events
具有基本相同的列,極大地解決了這個問題,將改變你的數據庫/應用程序使用single table inheritance。
假設你正在使用Rails低於5.x您的模型應該是這樣的:
class User < ApplicationRecord
has_many :projects
has_many :basic_events, through: :projects
has_many :additional_events, through: :projects
end
class Project < ApplicationRecord
belongs_to :user
has_one :basic_event
has_many :additional_events
end
class Event < ApplicationRecord
belongs_to :project
end
class BasicEvent < Event
belongs_to :project
end
class AdditionalEvent < Event
belongs_to :project
end
這樣,只有三個表涉及users
,projects
和events
。您的events
表格將有一個:type
列,您可以在其中指定它是否爲basic
或additional
。
對於您的疑問:
訪問所有項目每用戶
User
.select("users.*, count(projects.id) AS projects_count")
.joins(:projects)
.group('users.id')
.order('projects_count DESC')
計數使用select這樣給你訪問一個:projects_count
方法上的每個用戶對象返回這個活躍的記錄關係,所以如果你將這個查詢分配給一個名爲users_with_projects_count
的變量,你可以做users_with_projects_count.first.projects_count
它會ret與該用戶關聯的項目數量。
訪問所有活動計數,在零
User
.select("users.*, count(events.id) AS events_count")
.joins(:events)
.where('events.happened_at IS NULL')
.group('users.id')
其中happened_at屬性,您可以訪問:events_count
你在過去的例子一樣:projects_count
的方式相同。
已去所有用戶進行排序,事件的計數,其中happened_at屬性在零
User
.select("users.*, count(events.id) AS events_count")
.joins(:events)
.where('events.happened_at IS NULL')
.group('users.id')
.order('events_count DESC')
可以使用相同的查詢作爲最後一個例子只需要加一個:order
。
你能更具體說明你想要什麼嗎?我有點困惑你的計數每個用戶和其他 –
不確定,但我會嘗試。我想知道'用戶'具有的項目數量。並且還計算每個User的'Event's(但是這兩者之間沒有直接關聯,它通過'Project'發生)。最後,我希望所有'用戶'按「事件」的次數排序。我希望有所幫助。 –
是否有項目和事件之間的任何關聯?並且應該有用戶關聯到有許多事件的徹底項目。源將是事件 –