0

我的数据库中有一个名为部门的文本字段,我想在其中存储部门列表。用户将输入以逗号分隔的部门名称。例如:

department1, deaprtment2, department3

我希望在用户提交表单时将此值存储为数组。另外,我希望部门列表显示为下拉列表。最后,在更新表格时,部门字段也应该像以前一样可编辑(通过输入逗号分隔的文本进行更新)。

编辑: 我已将此添加到我的模型中:

class Org < ActiveRecord::Base
   serialize :department, Array
   attr_accessible :name, :department
   before_validation :update_department
   validates :name, presence: true
   def update_department
     if department_changed? and department.is_a?(String)
        self.department = self.department.split(',').collect(&:strip) 
    end
  end
end

和观点:

<%= f.text_area :department, :cols => "10", :rows => "10" %>

现在每当我尝试注册时,部门字段已经存在[],当我尝试更新部门时,已经是[“[department1”,“department2]”]。

我希望在注册时删除 [],并且在更新时只显示部门 1、部门 2。

请帮忙。

4

1 回答 1

1

最好的方法是通过你的模型。我假设您有一个名为 Org 的模型和另一个名为 Department 的模型,并且您已经定义了两者之间的许多关系。然后,您需要做的就是在您的 Org 模型中添加以下代码:

  def department_list
    departments.collect { |d| d.department_name }.join(', ')
  end

  def department_list=(text)
    if id && text
      departments.destroy_all
      text.split(',').each do |d|
        departments.create(department_name: d.strip.capitalize)
      end
    end
  end

然后在您的视图中使用@org.department_list 添加一个文本框。

编辑:

根据您的扩​​展问题,您在组织模型中有部门字段,您希望将其存储并显示为数组,但编辑为简单的文本字段。我对此的想法是,我不喜欢将部门数据存储在 org 中的字段的想法,它是一对多的关系,因此部门应该是一个单独的模型。我会从组织中删除部门字段。然后创建迁移以创建部门表。它应该看起来像这样:

class CreateDeparments < ActiveRecord::Migration
  def change
    create_table :departments do |t|
      t.integer :org_id
      t.string :department_name

      t.timestamps
    end
  end
end

接下来在 Department 模型中添加这行代码:

belongs_to :org

在 org 模型中添加以下内容:

  has_many :departments, dependent: :destroy

  def department_list
    departments.collect { |d| d.department_name }.join(', ')
  end

  def department_list=(text)
    if id && text
      departments.destroy_all
      text.split(',').each do |d|
        departments.create(department_name: d.strip.capitalize)
      end
    end
  end

在您的控制器和视图中,您现在拥有以下内容:

@org = Org.first
# List of departments as an array for a select
@org.departments
# A comma separated string for text boxes
@org.department_list

现在,department_list 方法可用于在文本框中显示列表,也可用于发布和更改。所以你的视图代码就变成了这样:

 <%= f.text_area :department_list, :cols => "10", :rows => "10" %>

您可能需要通过将 create 更改为以下内容来修改您的 org 控制器:

 def create
    @org = Org.new(params[:org])

    respond_to do |format|
      if @org.save
        @org.department_list = params[:org][:department_list]
        format.html { redirect_to org_url,
                      notice: "#{@org.name} was successfully created" }
        format.json { render json: @org,
                      status: :created, location: @org }
      else
        format.html { render action: "new" }
        format.json { render json: @org.errors, status: :unprocessable_entity }
      end
    end
 end

如果您仍然卡住,我在 github 上有一个完整的网站,您可以浏览一下。对你来说是组织和部门,在我的网站上是人员和技能或人员和学分。这是链接:

https://github.com/davesexton/CKCASTING

于 2013-08-05T15:12:45.917 回答