के माध्यम से मैं एक मानक है, जिनमें कई करने वाली कई उपयोगकर्ताओं और मेरे रेल अनुप्रयोग में भूमिकाओं के बीच के रिश्ते:रेल मुहावरा has_many में डुप्लिकेट से बचने के लिए:
class User < ActiveRecord::Base
has_many :user_roles
has_many :roles, :through => :user_roles
end
मुझे लगता है कि यदि कोई उपयोगकर्ता केवल सौंपा जा सकता है यह सुनिश्चित करना चाहते एक बार कोई भूमिका। डुप्लिकेट डालने का कोई भी प्रयास अनुरोध को अनदेखा करना चाहिए, त्रुटि फेंकना या सत्यापन विफलता का कारण नहीं होना चाहिए। जो मैं वास्तव में प्रस्तुत करना चाहता हूं वह एक "सेट" है, जहां सेट में पहले से मौजूद तत्व को सम्मिलित करना कोई प्रभाव नहीं पड़ता है। {1,2,3} यू {1} = {1,2,3}, {1,1,2,3} नहीं।
मुझे लगता है कि मैं इसे इस तरह कर सकते हैं:
user.roles << role unless user.roles.include?(role)
या एक आवरण विधि (जैसे add_to_roles(role)
) बनाने के द्वारा, लेकिन मैं कुछ मुहावरेदार जिस तरह से यह संघ के माध्यम से स्वत: बनाने के लिए के लिए उम्मीद की गई थी, ताकि मैं लिख सकता हूं:
user.roles << role # automatically checks roles.include?
और यह मेरे लिए काम करता है। इस तरह, मुझे डुप्लिकेट की जांच करने या कस्टम विधि का उपयोग करने के लिए याद रखना नहीं है। क्या ढीले ढांचे में कुछ है जो मुझे याद आ रही है? मैंने पहले सोचा था कि: uniq विकल्प है_मैनी ऐसा करेगा, लेकिन यह मूल रूप से बस "विशिष्ट चुनें"।
क्या यह घोषणा करने का कोई तरीका है? यदि नहीं, तो शायद एक एसोसिएशन एक्सटेंशन का उपयोग कर?
>> u = User.create User Create (0.6ms) INSERT INTO "users" ("name") VALUES(NULL) => #<User id: 3, name: nil> >> u.roles << Role.first Role Load (0.5ms) SELECT * FROM "roles" LIMIT 1 UserRole Create (0.5ms) INSERT INTO "user_roles" ("role_id", "user_id") VALUES(1, 3) Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "user_roles" ON "roles".id = "user_roles".role_id WHERE (("user_roles".user_id = 3)) => [#<Role id: 1, name: "1">] >> u.roles << Role.first Role Load (0.4ms) SELECT * FROM "roles" LIMIT 1 UserRole Create (0.5ms) INSERT INTO "user_roles" ("role_id", "user_id") VALUES(1, 3) => [#<Role id: 1, name: "1">, #<Role id: 1, name: "1">]
यह ऐसा काम नहीं करता है। मैं परीक्षण को शामिल करने के लिए पोस्ट अपडेट करूंगा। – KingPong
धन्यवाद, मैं एसोसिएशन एक्सटेंशन का प्रयास करूंगा। – KingPong
यह पूरी तरह से काम किया। धन्यवाद! जिस हिस्से में मैं कुछ खोने की कोशिश करता था, वह हिस्सा मैं प्रॉक्सी_owner बिट था। – KingPong