2012-12-03 31 views
6

Tôi đang tìm cách chỉnh sửa/thêm từ khóa liên quan đến một bài viết, nội dòng trong Activeadmin.Chỉnh sửa quan hệ nhiều-nhiều trong Activeadmin

tôi đã xác định một cách đơn giản nhiều-nhiều thiết lập:

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 

Tôi muốn thêm và chỉnh sửa các từ khóa ở dạng en Diện tích, vì vậy tôi thiết lập này trong 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 

Điều này hoạt động như mong đợi.

Nhưng nếu tôi thêm cùng một từ khóa vào hai khu vực khác nhau, từ khóa sẽ chỉ được tạo hai lần.

Khi nhập từ khóa mới (trong biểu mẫu Khu vực), tôi muốn nó tự động tạo mối quan hệ với từ khóa hiện tại hoặc tạo từ khóa mới, nếu từ khóa không tồn tại. Điều gì sẽ là cách tốt nhất để đi về nó?

Trả lời

4

Đây là câu trả lời khá muộn :) nhưng tôi thực sự đã gặp phải vấn đề tương tự trong một dự án của tôi ... Tôi phải thêm từ khóa/thẻ vào hai mô hình khác nhau, nhưng họ có thể chia sẻ chúng. Lúc đầu, tôi đã làm giống như bạn, và nó đã tạo ra một kỷ lục cho mỗi lần bạn "đính kèm" một từ khóa/thẻ vào một mô hình.

Cách tốt hơn để xử lý nó là sử dụng hệ thống gắn thẻ. Và tôi đã đạt được một hệ thống khá gọn gàng bằng cách kết hợp hai viên ngọc thực sự tốt: 'hành vi-as-taggable-on' (https://github.com/mbleigh/acts-as-taggable-on) và 'Select2-ray' (https://github.com/argerim/select2-rails)

Trong dự án của riêng tôi, tôi thực sự đã làm một cái gì đó tương tự như bạn và tạo ra một mô hình chỉ để có một danh sách tất cả các từ khóa thích hợp mà tôi muốn. Tuy nhiên, 'hành động-như-taggable-on' không cần thiết phải có danh sách các từ khóa được chấp nhận ... vì vậy bạn có thể tạo chúng ngay lập tức, và nó sẽ tự động xử lý các bản sao, số lượng, vv ..

'select2-rails 'chỉ cho phép bạn có giao diện đẹp để thêm và xóa từ khóa trong một trường, thay vì sử dụng hộp kiểm, chọn tùy chọn hoặc nhập văn bản nơi bạn sẽ phải tách riêng chuỗi bằng dấu phẩy hoặc dấu phân tách bất kỳ.

Nếu có ai cần thêm chi tiết về cách tôi triển khai tất cả, tôi sẽ rất vui khi cung cấp thêm mã .. nhưng tài liệu cho cả hai đều khá đơn giản!

EDIT: Vâng, tôi có một cảm giác một số mã sẽ thực sự có ích :)

Bundle cài đặt cả hai viên ngọc trong Gemfile

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

của bạn Trong mô hình Area của bạn, bạn có thể thêm những điều sau đây và làm cái gì đó như

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

    attr_accessible :area_keyword_list 

    acts_as_taggable_on :area_keywords 
end 

Và trong tập tin ActiveAdmin bạn

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 

và JS cho select2 là khá đơn giản ...

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

Voila!

+0

Giải pháp rất hay.Cám ơn vì đã chia sẻ! Tôi đã sử dụng cả hai đá quý sau khi tôi đăng câu hỏi này, nhưng nó làm cho cảm giác tốt để sử dụng chúng với nhau như thế này. –

+0

giải pháp tốt nhưng tôi muốn chọn một số tùy chọn mặc định. Cho phép nói trong quá trình cập nhật tôi muốn rằng các con hiện tại của tôi nên được chọn theo mặc định. Làm thế nào tôi có thể làm điều đó với select2. –

+0

tôi đã thực hiện nó với: selected => IDS –

Các vấn đề liên quan