2009-12-13 13 views
5

मान लें कि हमारे पास मानक पोस्ट & टिप्पणी मॉडल है, जिसमें पोस्ट accepts_nested_attributes_for :commments और :autosave => true सेट है।रेल: मैं नए रिकॉर्ड के नेस्टेड एसोसिएशन के मूल मॉडल तक कैसे पहुंच सकता हूं?

हम कुछ नई टिप्पणी के साथ एक साथ एक नया पद बना सकते हैं, जैसे:

@post = Post.new :subject => 'foo' 
@post.comments.build :text => 'bar' 
@post.comments.first # returns the new comment 'bar' 
@post.comments.first.post # returns nil :(
@post.save # saves both post and comments simultaneously, in a transaction etc 
@post.comments.first # returns the comment 'bar' 
@post.comments.first.post # returns the post 'foo' 

हालांकि, मैं टिप्पणी के भीतर से (उदाहरण के लिए अपने before_save या सत्यापन कार्यों से)

के बीच भेद करने में सक्षम होने की जरूरत है
  1. इस टिप्पणी एक पोस्ट (जो अमान्य है)
  2. इस टिप्पणी एक न सहेजा गया पोस्ट (जो मान्य है) से जुड़ा हुआ है
  3. से जुड़ी नहीं है

दुर्भाग्यवश, टिप्पणी से केवल self.post पर कॉल करना काम नहीं करता है, क्योंकि उपर्युक्त, यह सहेजने के बाद तक शून्य हो जाता है। बेशक कॉलबैक में, मुझे @post तक पहुंच नहीं है (केवल नहीं, केवल प्रश्न में टिप्पणी के स्वयं के लिए।

तो: मैं उस नेस्टेड एसोसिएशन मॉडल के परिप्रेक्ष्य से, नए रिकॉर्ड के घोंसले वाले संगठनों के मूल मॉडल तक कैसे पहुंच सकता हूं?

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

उत्तर

5

मुझे लगता है कि यह अजीब बात है कि रेल आपको ऐसा करने नहीं देते हैं। यह बाल मॉडल में मान्यताओं को भी प्रभावित करता है।

वहाँ काफी चर्चा और रेल बग ट्रैकर में कोई संकल्प इस बारे में के साथ एक टिकट दिया गया है:

Nested attributes validations circular dependency

और एक प्रस्तावित संकल्प:

nested models: build should directly assign the parent

असल में, सौदा यह है कि नेस्टेड विशेषता कोड बाल रिकॉर्ड में मूल सहयोग स्थापित नहीं करता है।

मेरे द्वारा जुड़े दूसरे टिकट में उल्लिखित कुछ कार्य-आसपास हैं।

+0

यह कैसे करेगा? आप parent_id कॉलम सेट नहीं करना चाहते हैं, तो आपको बच्चे पर कुछ छिपी हुई संपत्तियां जोड़नी होंगी? – MattMcKnight

+0

आप अपेक्षित _ids सेट किए बिना एक विशेषता (उदा। माता-पिता, बच्चे) सेट कर सकते हैं। इस तरह यह वर्तमान में नेस्टेड मॉडल बचत करता है - इसमें अभी भी रिकर्सिव नहीं होने की यह समस्या है। – Sai

+0

@Sai पोस्ट किए गए लिंक का पालन करते हुए, मैं देख सकता हूं कि यह 'inverse_of' विकल्प का उपयोग करके हासिल किया जा सकता है। – artificis

0

मुझे नहीं लगता कि आप यह कर सकते हैं। दूसरी तरफ, आपकी मान्यताओं में असफल नहीं होना चाहिए, क्योंकि लेनदेन के आदेश टिप्पणी को सहेजने से पहले पोस्ट रिकॉर्ड बनाएंगे।

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