2012-02-14 101 views
3

在數據庫中,如果性別爲女性,則存儲0,如果性別爲男性,則存儲1。Tinyint和選擇標籤與Rails在性別選擇

我有一個這樣的表單字段:

<%= myobject.select(:gender, options_for_select([['Male', 1], ['Female', 0]]), {:prompt => 'Select Gender'})%> 

效果很好時:

  1. 領域不已經選擇了「性別選擇」(無值的對象存在) 選項。
  2. 領域是數據庫中的男性已選男選項

然而,如果該字段爲女性它顯示了選擇性別選項。我相信是因爲數據庫中的0在被檢索時被認爲是錯誤的(因爲Rails假設Mysql中的0爲假),因此在select中它認爲它必須提示非值文本。

我應該如何處理這種情況,假設我無法觸及數據庫結構。

+0

AR認爲'tinyint'對於MySQL來說意味着'boolean',這就是1和0混合來自的地方。你能改變你的模式嗎? – 2012-02-14 21:28:40

+0

我敢打賭,我可以......我只是想知道是否有這種情況下的解決方案... – Nobita 2012-02-14 21:42:34

回答

2

將其移至答案而不是評論,因爲如果您無法更改架構,它實際上是一種可選的方式。

如果可以改變它: 字符串,:長度=> 1#(M/F)

否則可以使用這樣的轉換器:

myobject.rb

def m_f 
    myobject.gender ? 'M' : 'F' 
end 

attr_accessor :gender_string 


before_save :convert_gender 
def convert_gender 
    self.gender = myobject.gender_string == 'M' ? 1 : 0 
end 

_form.html.erb

<%= myobject.select(:gender_string, options_for_select([['Male', 'M'], ['Female', 'F']]), {:prompt => 'Select Gender', :selected => myobject.m_f})%> 

你然後需要將數據再次轉換一旦提交表格。