2011-02-02 6 views
5

मेरे पास कार्य और उपयोगकर्ता हैं। जब कोई उपयोगकर्ता कोई कार्य पूरा करता है, तो मैं एक पूर्णता बनाता हूं जिसमें उपयोगकर्ता के लिए यह फ़ील्ड होता है कि वे कितने समय तक व्यतीत करते हैं। मुझे एक ऐसा फॉर्म चाहिए जो सभी कार्यों को उनकी समापन स्थिति और time_spent विशेषता के साथ दिखाता है। सबमिट करने पर, मौजूद पूर्णता को अद्यतन किया जाना चाहिए और नए बनाए जाने चाहिए। यदि संभव हो तो मैं फॉर्मटास्टिक में ऐसा करना चाहता हूं लेकिन मैं मूल रेल 3 समाधान से खुश हूं।संबंधित रिकॉर्ड्स के उप-समूह के लिए कोई फॉर्म कैसे प्रदर्शित करें, जिनमें से कुछ अभी तक मौजूद नहीं हैं?

class Completion < ActiveRecord::Base 
    belongs_to :task 
    belongs_to :user 

    # attribute time_spent 
end 

class User < ActiveRecord::Base 
    has_many :completions 
    has_many :tasks, :through => :completions 
end  

class Task < ActiveRecord::Base 
    belongs_to :milestone 
    has_many :completions 
    has_many :users, :through => :completions 
end 

एक अतिरिक्त पहलू यह है कि मैं केवल मील का पत्थर से संबंधित कार्यों का एक निश्चित सेट दिखाना चाहता हूं। क्या मेरे पास मील का पत्थर नियंत्रक पर एक फॉर्म होना चाहिए जो पूर्णता नियंत्रक को पोस्ट करता है?

class Milestone < ActiveRecord::Base 
    has_many :tasks 
    has_many :completions, :through => :tasks 
end 

अद्यतन मैं दिनों के लिए देखा है अब और मैं manydeadends पाया है। यह Multiple objects in a Rails form करीब है, लेकिन यह आवश्यक है कि सभी लिंकिंग ऑब्जेक्ट्स पहले से मौजूद हों।

यह प्रश्न अलग-अलग सेट करता है कि कुछ लिंक अभी तक मौजूद नहीं हैं और इसमें घोंसले के लिंक के लिए कोई भी मॉडल नहीं है। रयान डाइगल के Nested Object Forms post के साथ) मैंने इस काम को किसी उपयोगकर्ता के लिए सभी संभावित पूर्णताओं को संपादित करने के लिए बनाया है, लेकिन मुझे एक रूप में संभावित पूर्णताओं का एक सबसेट संपादित करने की आवश्यकता है। क्या मुझे एक अनावश्यक वस्तु बनाने की आवश्यकता है मीलस्टोनकंपूर्णताएं has_many प्राप्तियां और belongs_to उपयोगकर्ता? एक सक्रिय मॉडल has_many कर सकते हैं?

+2

अभी आपके प्रश्न को और अधिक दिखाई देने के लिए मेरा उत्तर हटा दिया गया है, आपके द्वारा दिए गए विवरण के साथ अपना प्रश्न संपादित करें :) – apneadiving

+0

यह बहुत विचारशील है! मुझे इस मुद्दे को दूर करना पड़ा, इसलिए मैंने अंततः इसे छोड़ दिया और इसके आसपास काम किया। मैं रुचि रखने वाले किसी के लिए अपना उत्तर पोस्ट करूंगा। – Turadg

उत्तर

4

मैंने अंततः इसे हल किया। एक कुंजी fields_for पर संग्रह तर्क है। दूसरा संग्रह और मौजूदा रिकॉर्ड के मिश्रण के साथ संग्रह उत्पन्न करना है।

ध्यान में रखते हुए

तो, कुछ की तरह:

<%= form_for @user do |f| %> 
    <table> 
    <tr><th>Completed</th><th>Time spent</th><th>Task</th></tr> 

    <%= f.fields_for :completions, available_completions_for_milestone(@user, @milestone) do |cf| %> 
     <tr> 
     <td><%= cf.check_box :status, {disabled: cf.object.persisted?}, "done", "unreported" %></td> 
     <td><%= cf.text_field :time_spent_text %></td> 
     <td><%= cf.object.task.description %></td> 
     </tr> 
     <%= cf.hidden_field :task_id %> 
    <% end -%> 
एक सहायक विधि के साथ

:

def available_completions_for_milestone(user, milestone) 
    user_completions = user.completions.in_milestone(milestone)  
    available = [] 
    milestone.tasks.each do |t| 
    c = user_completions.select{|c| c.task_id == t.id}.first 
    if !c then # make it 
     c = user.completions.build(task: t) 
    end 
    available << c 
    end 
    available 
end 

राय यह है कि डीबी में पहले से ही पूर्ण करने में सूचना की जाँच की और विकलांग कर रहे हैं ताकि वे नहीं कर सकते अनचेक हो। अनियंत्रित राज्य मूल्य हो जाता है "असूचित" और उपयोगकर्ता मॉडल उन रिकॉर्ड को फ़िल्टर ताकि वे डीबी में मत जाओ कर सकते हैं:

has_many :completions 
accepts_nested_attributes_for :completions, :reject_if => proc { |attrs| attrs['status'] == 'unreported' } 

मैं भी उपयोगकर्ता मॉडल पर completions_attributes attr_accessible करना था। यदि आप task_ids पहुंच योग्य बनाते हैं तो updatePUT से बाहर किए गए पूर्णता को हटा देगा।

0

मैं इसे किसी भी अन्य पाठकों के लिए एक संभावित समाधान के रूप में उत्तर दे रहा हूं, लेकिन यह संतोषजनक नहीं है इसलिए मैं इसे स्वीकार्य नहीं मान रहा हूं।

इस के आसपास काम करने के लिए, फॉर्म पीढ़ी की कार्रवाई में मैं केवल create किसी 'निष्क्रिय' स्थिति में किसी भी अनुपस्थित एसोसिएशन। (status फ़ील्ड को Completion मॉडल में जोड़कर।) फिर मैं प्रपत्रों की "ऑब्जेक्ट []" सरणी संपादन सुविधा का उपयोग करता हूं। आरआईएससीफ्यूचर की दूसरी टिप्पणी में the forms_for API docs पर कुछ उपयोगी टिप्स हैं।

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

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