प्रीलोडिंग को अनदेखा करती है क्या रेलवे में has_many
एसोसिएशन के लिए एक विधि का प्रतिनिधि बनाना संभव है, और अभी भी उस एसोसिएशन पर प्रीलोड किए गए डेटा को डिलीटर के नियमों का पालन करते समय सहेजना संभव है? वर्तमान में मुझे ऐसा लगता है कि आपको एक या दूसरे को चुनने के लिए मजबूर होना पड़ता है। यही है: अपने प्रीलोड किए गए डेटा को प्रतिनिधि न दें, या अपना प्रीलोड किए गए डेटा और प्रतिनिधि को खो दें।has_many एसोसिएशन के लिए प्रतिनिधि विधि
उदाहरण: मैं निम्नलिखित दो मॉडल हैं:
class User < ApplicationRecord
has_many :blogs
delegate :all_have_title?, to: :blogs, prefix: false, allow_nil: false
def all_blogs_have_title?
blogs.all? {|blog| blog.title.present?}
end
end
class Blog < ApplicationRecord
belongs_to :user
def self.all_have_title?
all.all? {|blog| blog.title.present?}
end
end
नोटिस: कि User#all_blogs_have_title?
all_have_title?
के प्रतिनिधिमंडल पद्धति के रूप में सटीक एक ही बात करता है।
निम्नलिखित, जैसा कि मैं इसे समझता हूं, डेमेटर के कानून का उल्लंघन करता है। हालांकि:
user = User.includes(:blogs).first
User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]]
Blog Load (0.1ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."user_id" = 1
=> #<User id: 1, name: "all yes", created_at: "2017-12-05 20:28:00", updated_at: "2017-12-05 20:28:00">
user.all_blogs_have_title?
=> true
सूचना: यह आपके प्रीलोडेड डेटा का कहना है जब मैं user.all_blogs_have_title?
कहा जाता है यह एक अतिरिक्त क्वेरी नहीं किया। हालांकि, ध्यान दें कि विधि all_blogs_have_title?
Blog
विशेषताएँ पूछ रही है, जो डेमेटर के कानून का उल्लंघन कर रही है।
अन्य तरीका Demeter के कानून लागू होता है, लेकिन आप पहले से लोड डेटा खो जो:
user = User.includes(:blogs).first
User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]]
Blog Load (0.1ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."user_id" = 1
=> #<User id: 1, name: "all yes", created_at: "2017-12-05 20:28:00", updated_at: "2017-12-05 20:28:00">
user.all_have_title?
Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."user_id" = ? [["user_id", 1]]
=> true
उम्मीद है कि दोनों कार्यान्वयन के नकारात्मक पक्ष यह स्पष्ट है। आदर्श रूप से: मैं इसे प्रतिनिधि कार्यान्वयन के साथ दूसरा तरीका करना चाहता हूं, लेकिन उस प्रीलोड किए गए डेटा को बनाए रखने के लिए। क्या यह संभव है?