2017-08-24 2 views
0

J'ai un problème pour afficher les valeurs correctes dans la collection Active Admin Tag.Collection Active Tag Tag avec table jointe

enter image description here

Pour construire beaucoup à de nombreuses relations que je crée une table jointe:

create_table "profession_allocations", force: :cascade do |t| 
    t.integer "master_id" 
    t.integer "slave_id" 
    t.index ["master_id"], name: "index_profession_allocations_on_master_id", using: :btree 
    t.index ["slave_id"], name: "index_profession_allocations_on_slave_id", using: :btree 
    end 

et un modèle:

class ProfessionAllocation < ApplicationRecord 

    has_and_belongs_to_many :master, :class_name => 'Profession' 
    has_and_belongs_to_many :slave, :class_name => 'Profession' 

end 

pour établir des relations avec ma table de profession:

create_table "professions", force: :cascade do |t| 
    t.string "kind",         null: false 
    t.string "list",         null: false 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
    t.string "summary_de", default: "summary german", null: false 
    t.string "summary_en", default: "summary english", null: false 
    end 

et le modèle:

class Profession < ApplicationRecord 

    validates_presence_of :kind, :list 
    validates :kind, presence: true, uniqueness: true 
    validates :list, presence: true 
    validates :summary_de, presence: true 
    validates :summary_en, presence: true 

    has_many :master_profession_allocations, :class_name => 'ProfessionAllocation', :foreign_key => 'master_id' 
    has_many :slave_profession_allocations, :class_name => 'ProfessionAllocation', :foreign_key => 'slave_id' 

end 

intérieur Administrateur actif J'utilise la pierre précieuse activeadmin_addons d'utiliser des balises, mais je suppose que cela ne garance pour cette question.

if f.object&.persisted? 
      f.input :master_profession_allocations, as: :tags, collection: Profession.where.not(id: f.object.id).order('summary_en ASC'), display_name: :summary_en 
     else 
      f.input :master_profession_allocations, as: :tags, collection: Profession.all.order('summary_en ASC'), display_name: :summary_en 
     end 
end 

Lors de la création du ProfessionAllocation fonctionne très bien avec la collection Tag, la vue d'édition fait des problèmes, car il affiche les ProfessionAllocations et non les professions connexes. Ma question est, comment puis-je afficher la profession connexe dans la collection de balises?

Meilleur Alex

Répondre

1

Je l'ai résolu de créer un paragraphe. Cela me permet également de stocker des données supplémentaires dans l'allocation:

f.inputs do 
     f.has_many :master_profession_allocations, heading: 'Slaves', allow_destroy: true, new_record: true do |pa| 
      if f.object&.persisted? 
      pa.input :level, as: :select, collection: ProfessionAllocation::LEVELS 
      pa.input :slave_id, as: :select, collection: Profession.joins('LEFT JOIN profession_allocations pa on professions.id = pa.master_id WHERE professions.id !=' + f.object.id.to_s).map { |pa| [pa.summary_en, pa.id] } 
      else 
      pa.input :level, as: :select, collection: ProfessionAllocation::LEVELS 
      pa.input :slave_id, as: :select, collection: Profession.joins('LEFT JOIN profession_allocations pa on professions.id = pa.master_id').map { |pa| [pa.summary_en, pa.id] } 
      end 
     end 
     end