2009-06-14 14 views
7

डेटामैपर ओआरएम के साथ एक शुरुआतकर्ता है, इसलिए मुझे जटिल पूछताछ के बारे में सवाल है।जटिल डेटामैपर क्वेरी एसोसिएशन

सबसे पहले, यहाँ सरल है डेटा वस्तुओं:

+ ------- + + ------- + + ------- + 
| 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 | 
         | ....... | 
         + ------- + 

तो, उदाहरण के लिए उपयोगकर्ता 1 कुछ आइटम एन समय देखा गया है:

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 

यह कैसे DB में डेटा लग रहा है की तरह है। और मैं क्या समझ नहीं सकता, आइटम का चयन कैसे करें और उपयोगकर्ता से संबंधित उनकी कार्य राशि का चयन कैसे करें।

+ -------------------- | 
| Items (item_id, num) | 
+ -------------------- | 
| 3, 2     | 
| 4, 2     | 
| 5, 1     | 
| 6, 1     | 
+ -------------------- + 

पी.एस.:

उदाहरण के लिए, उपयोगकर्ता 1 के लिए परिणाम इस तरह से किया जाना चाहिए नियमित रूप से 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; 

तो, कैसे यह करने के लिए और जटिल datamapper क्वेरी के बारे में कोई भी दस्तावेज़ देखते हैं क्या है?

उत्तर

2

जहां तक ​​मुझे पता है, ऑपरेटर द्वारा डेटामैपर या उसके किसी भी प्लगइन में कोई समूह नहीं है। यदि वहां थे, तो यह समेकन कार्यों (गणना, न्यूनतम, अधिकतम, औसत) के साथ डीएम-एग्रीगेट्स में जाएगा। इससे एसक्यूएल का उपयोग किये बिना एक प्रश्न में आप जो चाहते हैं उसे दोहराना मुश्किल हो जाता है।

आप कुछ इस तरह की कोशिश कर सकते:

require 'dm-aggregates' 

Item.all.map do |item| 
    [item.title,item.actions.count(:user_id=>@user_id)] 
end 

लेकिन, आप बस के रूप में आसानी से अपने एसक्यूएल लेने के लिए और एक 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 

repository.adapter.query structs की एक सरणी देता है ताकि आप की तरह

user.item_views[0].title 
12

बातें कर सकता है मामला किसी में अभी भी सोच रहा है:

Action.aggregate(:item_id, :all.count, :user_id => 1, :order => [item_id.asc]) 

[ [ 3, 2 ], 
    [ 4, 2 ], 
    [ 5, 1 ], 
    [ 6, 1 ] 
] 
की तरह कुछ लौट जाएगा

यहां सभी.count द्वारा ऑर्डर करने का कोई तरीका नहीं है, लेकिन यह आपको वह डेटा प्राप्त करता है जो आप चाहते हैं :)

+0

धन्यवाद - यह डेटामैपर दस्तावेज़ से बिल्कुल स्पष्ट नहीं है। डीएम एआर की तुलना में कड़े एसक्यूएल कोड उत्पन्न करता है, लेकिन यह सीखने के लिए इस तरह एक स्टैक ओवरफ्लो उत्तर लेता है। –

संबंधित मुद्दे