2013-06-12 22 views
0

前一段時間,我問了一個類似的關於選擇選項的問題,但我似乎還是無法把頭圍住它。我是相當新的軌道,但這裏就是我想要做Rails:Select options

我有一個帖子表&在裏面,我有一個「post_status」一欄。我 想給每個崗位3個選項:

  1. 草案
  2. 待定
  3. 發佈

我將如何去創造Rails中這3個選項?(我被告知不要使用布爾本)

預先感謝您

回答

1

@Alexander Kobelev答案詳細闡述,我會把它放在模型中:

class Post < ActiveRecord::Base 
    STATUS_OPTIONS = { 
    :draft => 'Draft', 
    :pending => 'Pending', 
    :published => 'Published' 
    } 
    validates_inclusion_of :post_status, :in => STATUS_OPTIONS.keys 
end 

在你看來:

發佈狀態:<%= select(:post, :post_status, Post::STATUS_OPTIONS.invert) %>

+0

這非常簡單。不需要生成另一個控制器/模型。謝謝@Cody – Jon

1

在他們看起來是一個能處理的幾種方法狀態標誌這個特殊的實例,但你問選擇選項,所以這裏是該方法的解決方案。

因爲您沒有指定是否需要保留表中的值,我已經詳細介紹了一種方法,可以通過將它們轉換爲ID(假設它們當前是字符串)來保留它們,如果這不是相關,然後只遵循大膽的指示。

創建一個PostStatus資源(模型,遷移,控制器/視圖,如果你需要改變它們的能力)。

定義的關係

PostStatus 
    has_many :posts 

Post 
    belongs_to :post_status 

添加值到您的PostStatus表(如果你有在這裏,應該匹配現有崗位狀態的字符串表字符串直播系統,讓你轉換數據(詳細如下)

在Post表中將列名更改爲post_status_id,將其類型更改爲int。如果這不是活的,那麼只需重新執行該列的整數遷移如果它是一個實時系統,則需要將數據轉換爲新列,而不是僅更改其類型,以下是建議的方法。

add_column :posts, :post_status_id_tmp, :int 

Post.reset_column_information # make the new column available to model methods 
Post.all.each do |post| 
    # Assuming you have a string with the option text currently: 
    post.post_status_id_tmp = PostStatus.find_by_name(post.post_status).id 
    post.save 
end 

remove_column :posts, :post_status 
rename_column :posts, :post_status_tmp, :post_status_id 

在你的文章表單中添加一個選擇框。

<%= form.collection_select :post_status_id, PostStatus.all, :id, :name %> 

這應該至少讓你開始!

+0

雖然這工作,它需要另一個DB命中拿到狀態(在例如英語術語),或你在取得貪婪加載它。總體來看,似乎更多的工作沒有太多的收穫。除非你想動態管理狀態選項。 –

1

你可以嘗試這樣的事情:

class Post < ActiveRecord::Base 
validates_inclusion_of :status, :in => [:draft, :pending, :publish] 

def status 
    read_attribute(:status).to_sym 
end 

def status= (value) 
    write_attribute(:status, value.to_s) 
end 
end 

其中狀態爲:字符串,極限:20(只是舉例)遷移

,或者你可以嘗試使用https://github.com/jeffp/enumerated_attribute

+0

這一個看起來更簡單,我開始圍繞它環繞我的頭。什麼是'極限:20'在做什麼?我正在測試它現在btw,看看我能否得到它的工作@亞歷山大 – Jon

+0

@Jon極限:20 - 最大長度的字符串。看看http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column –