2013-06-18 61 views
0

我試圖從下拉列表中保存用戶(如學生,老師)的多個角色。我正在使用「選擇」控件<%= f.select :role,["Teacher","Student"],{},{:multiple => true ,:required => true} %>來保存數據庫中的多個值。目前,我可以從下拉列表中選擇多個值並以"---\n- ''\n- Teacher\n- Student\n">的格式保存在數據庫中。但我只想保存[教師學生]。我不知道,如何刪除「--- \ n - 」。我嘗試chomp,檢查方法,但沒有運氣。 一爲的事情,「選擇控制需要輸入值陣列,但在用戶表中我的角色列是字符串類型。如何刪除「--- n-''n-」在軌道上的紅寶石數據庫中保存的新行空間

_form.html.erb

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

schema.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 

保存在db中的角色

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

目前我能夠從"---\n- ''\n- Teacher\n- Student\n">格式下拉式保存值。但是我想像老師學生一樣保存它們,不用逗號。任何想法如何保存字符串列中的數組值。

謝謝。

回答

2

我在@ joe-half-face解決方案和google serarch的幫助下得到了解決方案。以下是針對上述問題的解決方案。

首先,我試着用

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"]但仍然第一個數組值是零。我通過在用戶模型中放置以下代碼來解決此問題。

解決方案

serialize :role 
before_save :make_array 

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

所有這些代碼進入用戶模式。

1

已更新

當select從select到model時,它們都有to_s方法調用它們。結果是你在數據庫中看到的。如果你想保存在不同的格式的值可以選擇使用PosgtreSQL陣列列(我想你需要導軌4爲)或過濾器之前序列化他們在那樣

serialize :role, Array 

要獲得逗號分隔值(和任何可能的空白扔掉)

+0

hi @michał-szyndel,謝謝你的回覆。但是如何刪除「--- \ n-。基本上這些來自下拉菜單,因爲它具有這些數組格式的值,但是我在用戶表中的角色列是字符串。任何想法都可以解決它。 –

+0

@VSiingh你問怎麼樣從現有的記錄中刪除?首先做我所說的,他們重新從表格中保存記錄(選擇適當的值) –

1

不能陣列保存在數據庫列(不計算之類的東西hstore)

在這種情況下做什麼的軌道是用YAML到數組序列化到一個字符串。這是「---」的來源:它是YAML格式的一部分。

如果您想在該列中存儲其他內容,那麼在您到達模型之前操縱傳遞給您的控制器的參數取決於您。

1
serialize :role, Array 
before_save :make_array 

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

hi @ joe-half-face感謝您的回覆。整個解決方案,但我得到輸出像[[[「」,「學生」,「作者」]]]。有兩個問題,第一個額外的方括號和第一個數組值是零,即使我們不選擇。用serialize:role,Array,額外的方括號消失了,但是額外的nil數組值仍然存在我已經給我的問題提供瞭解答工作解決方案 –

+0

@VSiingh,我只是不知道輸入字符串是什麼,如果它是「學生作者「這將工作,但如果它看起來像在一開始陣列,沒有必要在這。 Serialize只是將字符串保存爲數組語法「[,,...]」,但是當Rails從數據庫中獲取它時,它將它視爲數組。所以,如果字符串看起來像「[,....]」,不需要額外的方法,如果不是,你應該使用split或者類似的東西 –

相關問題