1

我正在尝试从下拉列表中为 db 中的用户(如学生、教师)保存多个角色。我正在使用“选择”控件<%= f.select :role,["Teacher","Student"],{},{:multiple => true ,:required => true} %>在数据库中保存多个值。目前我可以从下拉列表中选择多个值并以下列格式保存在数据库中"---\n- ''\n- Teacher\n- Student\n">。但我只想保存[老师学生]。我不知道如何删除“---\n-”。我尝试使用 chomp,检查方法,但没有运气。一件事,“选择控件在数组中接受输入值,但我在用户表中的角色列是字符串类型。

_form.html.erb

<div>*<%= f.label :role %><br />
<%= f.select :role,["Teacher","Student"],{},{:multiple => true ,:required => true} %>
</div>

架构.rb

create_table "users", :force => true do |t|
    t.string   "email",                  :default => "", :null => false
    t.string   "encrypted_password",     :default => "", :null => false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          :default => 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.boolean  "is_admin"
    t.string   "username"
    t.string   "first_name"
    t.string   "last_name"
    t.string   "contact_no"
    t.date     "birth_date"
    t.boolean  "is_active"
    t.date     "joining_date"
    t.string   "avatar_url"
    t.boolean  "is_hr"
    t.boolean  "is_manager"
    t.string   "designation"
    t.string   "user_code"
    t.string   "user_role"
    t.string   "role"
  end

保存在数据库中的角色

 role: "---\n- ''\n- Teacher\n- Student\n">

"---\n- ''\n- Teacher\n- Student\n">目前,我能够以格式保存下拉列表中的值。但我想像老师学生一样保存他们,没有任何逗号。知道如何在字符串列中保存数组值。

谢谢。

4

4 回答 4

2

我在@joe-half-face 解决方案和谷歌搜索的帮助下得到了解决方案。以下是上述问题的工作解决方案。

首先我尝试过

serialize :role, Array
 before_save :make_array

def make_array
self.role=self.role.split(" ")
end

它给了我像 ** 这样的一半解决方案[[["", "Teacher", "Student", "Author"]]]**。解决方案的问题在于,即使我没有选择第一个值,它也会给我额外的方括号和第一个数组值为零。serialize :role, Array 给了我类似的输出,["", "Teacher", "Student", "Author"]但第一个数组值仍然是 nil。我通过将以下代码放入用户模型中解决了这个问题。

解决方案

 serialize :role
 before_save :make_array

 def make_array
  self.role.reject!(&:blank?) if self.role
  end

所有这些代码都转到用户模型。

于 2013-06-19T07:21:11.187 回答
1

您不能将数组保存在数据库列中(不包括 hstore 之类的东西)

在这些情况下,rails 所做的是使用 YAML 将数组序列化为字符串。这就是“---”的来源:它是 YAML 格式的一部分。

如果您想在该列中存储其他内容,那么您可以在传递给控制器​​的参数到达模型之前对其进行操作。

于 2013-06-18T21:13:46.207 回答
1
 serialize :role, Array
 before_save :make_array

def make_array
self.role=self.role.split(" ")
end
于 2013-06-18T22:26:44.363 回答
1

更新

当来自 select 的值下降到模型时,它们必须调用它们的 to_s 方法。结果就是你在 dabatase 中看到的。如果你想以不同的格式保存值,你可以使用 PosgtreSQL 数组列(我认为你需要 rails 4)或者在过滤之前将它们序列化

serialize :role, Array

获取逗号分隔值(以及丢弃任何可能的空格)

于 2013-06-18T18:39:29.890 回答