我是DataMapper ORM的初学者,所以我对复杂的查询有疑问.
首先,这是简化的数据对象:
class User
property :id, Serial
property :login, String
has n, :actions
end
class Item
property :id, Serial
property :title
has n, :actions
has n, :users, :through => :actions
end
class Action
property :user_id, Integer
property :item_id, Integer
belongs_to :item
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
这就是db中的数据的样子:
+ ------- + + ------- + + ------- +
| Users | | Items | | Actions |
+ ------- + + ------- + + ------- +
| 1 | u1 | | 3 | i1 | | 1 | 4 |
| 2 | u2 | | 4 | i2 | | 1 | 3 |
| ....... | | 5 | i3 | | 1 | 4 |
+ ------- + | ....... | | 1 | 5 |
+ ------- + | 1 | 6 |
| 1 | 3 |
| ....... |
+ ------- +
Run Code Online (Sandbox Code Playgroud)
因此,例如用户1已经查看了一些项目N次.而我无法弄清楚,如何选择与用户相关的项目及其行动金额.
例如,用户1的结果应如下所示:
+ -------------------- |
| Items (item_id, num) |
+ -------------------- |
| 3, 2 |
| 4, 2 |
| 5, 1 |
| 6, 1 |
+ -------------------- +
Run Code Online (Sandbox Code Playgroud)
PS常规SQL查询符合我的需求:
SELECT i.id, i.title, COUNT(*) as 'num'
FROM actions a
JOIN items i on i.id = a.item_id
WHERE a.user_id = {USERID}
GROUP by a.id
ORDER BY num DESC
LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
那么,如何做到这一点,是否有任何关于复杂数据映射器查询的文档?
mlt*_*tsy 12
如果有人还在想:
Action.aggregate(:item_id, :all.count, :user_id => 1, :order => [item_id.asc])
Run Code Online (Sandbox Code Playgroud)
将返回类似的东西
[ [ 3, 2 ],
[ 4, 2 ],
[ 5, 1 ],
[ 6, 1 ]
]
Run Code Online (Sandbox Code Playgroud)
这里没有办法通过all.count订购,但它可以获得你想要的数据:)
据我所知,datamapper 或其任何插件中没有 group by 运算符。如果有,它将与聚合函数(count、min、max、avg)一起放入 dm-aggregates 中。这使得在不使用 sql 的情况下很难在一个查询中复制您想要的内容。
你可以尝试这样的事情:
require 'dm-aggregates'
Item.all.map do |item|
[item.title,item.actions.count(:user_id=>@user_id)]
end
Run Code Online (Sandbox Code Playgroud)
但是,您可以轻松地将 sql 封装在 fn 中。
class User
def item_views
repository.adapter.query "SELECT i.id, i.title, COUNT(*) as 'num'
FROM actions a
JOIN items i on i.id = a.item_id
WHERE a.user_id = {USERID}
GROUP by a.id
ORDER BY num DESC
LIMIT 10;"
end
end
Run Code Online (Sandbox Code Playgroud)
repository.adapter.query
返回一个结构数组,这样你就可以做类似的事情
user.item_views[0].title
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3383 次 |
最近记录: |