2012-12-03 17 views
6

में कई से अधिक संबंधों को संपादित करना मैं एक लेख से संबंधित कीवर्ड संपादित/जोड़ने के लिए एक तरीका ढूंढ रहा हूं, Activeadmin में इनलाइन।Activeadmin

मैं परिभाषित किया है एक सरल कई-से-अनेक स्थापना:

class Area < ActiveRecord::Base 
    has_many :area_keywords 
    has_many :keywords, :through => :area_keywords 
    accepts_nested_attributes_for :keywords, :reject_if => :all_blank, :allow_destroy => true 
end 

class AreaKeyword < ActiveRecord::Base 
    belongs_to :area 
    belongs_to :keyword 
end 

class Keyword < ActiveRecord::Base 
    has_many :area_keywords 
    has_many :areas, :through => :area_keywords 
end 

मैं एन क्षेत्र के रूप में जोड़ने के लिए और, कीवर्ड को संपादित करना चाहते हैं तो Aciveadmin में मैं सेटअप इस:

ActiveAdmin.register Area do 
    form do |f| 
    f.inputs "Area details" do 
     f.input :title 
     f.input :description 
    end 
    f.has_many :keywords do |k| 
     if k.object.nil? 
     k.input :word, :label => 'Keyword' 
     else 
     k.input :word, :label => k.object.word 
     k.input :_destroy, :as => :boolean, :label => "delete" 
     end 
    end 
    end 
end 

यह अपेक्षा के अनुसार काम करता है।

लेकिन यदि मैं एक ही कीवर्ड को दो अलग-अलग क्षेत्रों में जोड़ता हूं, तो कीवर्ड को दो बार बनाया जाएगा।

कोई नया कीवर्ड (क्षेत्र के रूप में) दर्ज करते समय, मैं इसे मौजूदा कीवर्ड से स्वचालित रूप से एक संबंध बनाना चाहता हूं, या यदि कोई अस्तित्व नहीं है, तो नया कीवर्ड बनाएं। इसके बारे में जाने का सबसे अच्छा तरीका क्या होगा?

उत्तर

4

यह एक बहुत देर से जवाब है :) लेकिन मुझे वास्तव में मेरी परियोजनाओं में से एक में एक समान समस्या का सामना करना पड़ा है ... मुझे दो अलग-अलग मॉडल में कीवर्ड/टैग जोड़ना था, लेकिन वे उन्हें साझा कर सकते थे। सबसे पहले मैंने आपके जैसा ही किया था, और जब भी आप एक मॉडल/कीवर्ड को "मॉडल" देते हैं तो यह रिकॉर्ड बना रहा था।

इसे संभालने का एक बेहतर तरीका टैगिंग सिस्टम का उपयोग करना है। और मैं दो वास्तव में अच्छा जवाहरात के संयोजन के द्वारा एक बहुत साफ प्रणाली हासिल की: 'में कार्य करता है के रूप में taggable-ऑन' (https://github.com/mbleigh/acts-as-taggable-on) और 'Select2-रेलों' (https://github.com/argerim/select2-rails)

अपने ही परियोजना में, मैं वास्तव में मैंने आपके जैसा कुछ किया और बस मेरे इच्छित सभी आवश्यक कीवर्ड की एक सूची बनाने के लिए एक मॉडल बनाया। लेकिन 'एक्ट-ए-टैगगेल-ऑन' पर necesarilly को स्वीकृत कीवर्ड की एक सूची की आवश्यकता नहीं है ... ताकि आप उन्हें फ्लाई पर बना सकें, और यह स्वचालित रूप से डुप्लिकेट, गणना आदि को संभाल लेगा।

'select2-rails 'आपको चेकबॉक्स का चयन करने के बजाय, एक विकल्प में कीवर्ड जोड़ने और हटाने के लिए एक अच्छा इंटरफ़ेस प्राप्त करने की अनुमति देता है, विकल्पों का चयन करें, या एक टेक्स्ट इनपुट जहां आपको अपनी स्ट्रिंग को अल्पविराम या किसी सेपरेटर्स के साथ मैन्युअल रूप से अलग करना होगा।

अगर किसी को भी सभी को लागू करने के तरीके के बारे में अधिक जानकारी चाहिए, तो मुझे अधिक कोड प्रदान करने में खुशी होगी .. लेकिन दोनों के लिए प्रलेखन बहुत सरल है!

संपादित करें: ठीक है, मैं एक कुछ कोड महसूस वास्तव में उपयोगी :)

बंडल अपने Gemfile

gem 'acts-as-taggable-on' 
gem 'select2-rails' 

में दोनों मणि स्थापित अपने Area मॉडल में होगा, तो आपको निम्न जोड़ सकते हैं और कर सकता है

class Area < ActiveRecord::Base 
    # .. your code 

    attr_accessible :area_keyword_list 

    acts_as_taggable_on :area_keywords 
end 

की तरह और अपने ActiveAdmin फाइल में कुछ

ActiveAdmin.register Area do 

    form do |f| 
     f.inputs do 
     # .. whatever fields you have 
     f.input :area_keyword_list, 
      :as => :select, 
      :multiple => :true, 
      :collection => # here either a list of accepted keyword..or just left open, 
      :input_html => { :class => "multiple-select" } 
     end 
    end 
end 

और select2 के लिए जे एस काफी सरल है ...

$(".multiple-select").select2(); 

देखा!

+0

बहुत अच्छा समाधान।साझा करने के लिए धन्यवाद! मैंने इस प्रश्न को पोस्ट करने के बाद दोनों रत्नों का उपयोग किया है, लेकिन इस तरह उन्हें एक साथ उपयोग करने के लिए अच्छी समझ है। –

+0

अच्छा समाधान लेकिन मैं चाहता हूं कि कुछ डिफ़ॉल्ट विकल्प चुने जाएं। चलिए अद्यतन के दौरान कहते हैं कि मैं चाहता हूं कि मेरे वर्तमान बच्चों को डिफ़ॉल्ट रूप से चुना जाना चाहिए। मैं इसे चयन 2 के साथ कैसे कर सकता हूं। –

+0

मैंने इसे किया है: चयनित => आईडीएस –

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