【问题标题】:Ruby On Rails Active Admin has_many dropdown to add new objectRuby On Rails Active Admin has_many 下拉列表添加新对象
【发布时间】:2017-06-03 18:07:44
【问题描述】:

我有一个模型与另一个模型具有自引用 has_many 关系。 所以我有模型Product,每个产品可以有另一个产品。

class Project < ActiveRecord::Base
  has_many :project_connections
  has_many :related_projects, through: :project_connections,
                              dependent: :destroy
  accepts_nested_attributes_for :project_connections,
                                :related_projects, allow_destroy: true

  ...
end

还有我的ProjectConnection 模特:

class ProjectConnection < ActiveRecord::Base
  belongs_to :project
  belongs_to :related_project, class_name: Project

  accepts_nested_attributes_for :project
  accepts_nested_attributes_for :related_project

  ...
end

在 Active Admin 中,我想在创建/编辑项目视图中删除或添加相关项目。 在admin/project.rb

form do |f|
    inputs 'Продолжение проекта' do
      f.has_many :related_projects, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
        i.input :id, as: :select, collection: Project.all, include_blank: false
      end
    end
end

http://localhost:3000/admin/projects/1/edit

添加新的related_project 并按更新项目后,没有任何改变。 那么我应该怎么做才能解决这个问题呢?谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby activeadmin


    【解决方案1】:

    一个可能的解决方案是在项目中使用一个抽象字段 connected_project_ids 和一个 before_save 过滤器来持久化更改,并在加载后填充该字段以初始化表单

    before_save   :connect_projects
    after_find    :set_connected_project_ids
    attr_accessor :connected_project_ids
    
    def set_connected_project_ids
      self.connected_project_ids = connected_projects.pluck(:related_project_id)
    end
    
    def connect_projects
      connected_ids = connected_projects.pluck(:related_project_id)
    
      #projects that are in connected_project_ids, but not yet associated
      projects_to_connect = connected_project_ids - connected_ids
      projects_to_connect.each do |cp_id|
        connected_projects.create(related_project_id: cp_id) 
      end
    
      #projects that are associated, but not in connected_project_ids
      projects_to_disconnect = connected_ids - connected_project_ids
      projects_to_disconnect.each do |cp_id|
        connected_projects.where(related_project_id: cp_id).destroy_all
      connected_ids
    end
    

    这将允许您通过在 connected_project_ids 字段中提交现在应该与之关联的项目 ID 数组来添加和删除关联的项目。

    【讨论】:

      【解决方案2】:

      所以,我自己解决了问题。由于 ProjectConnection 存储项目 {id、project_id、related_project_id} 之间的连接,因此使用 projects.project_connections 而不是 projects.related_projects 进行操作是正确的。首先,我在admin/project.rb 中为projects.project_connections 声明了一个参数结构:

      project_connections_attributes: [
        :id,
        :project_id,
        :related_project_id,
        :_destroy
      ]
      

      然后代替

      inputs 'Продолжение проекта' do
        f.has_many :related_projects, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
          i.input :id, as: :select, collection: Project.all, include_blank: false
        end
      end
      

      我写的

      inputs 'Продолжение проекта' do
        f.has_many :project_connections, heading: 'Добавьте проект', allow_destroy: true, new_record: true  do |i|
          i.input :related_project_id, as: :select, collection: Project.all, include_blank: false
          i.input :project_id, :input_html => { :value => f.object.id }, as: :hidden
        end
      end
      

      效果很好)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-07-04
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多