Rails:选择选项

时间:2013-06-12 23:37:59

标签: ruby-on-rails

前一段时间我问了一个关于选择选项的类似问题,但我似乎仍无法绕过它。我对铁杆很新,但这就是我要做的事情

  

我有一张Post table&在其中,我有一个“ post_status ”列。一世   我想给每个帖子3个选项:

     
      
  1. 草案
  2.   
  3.   
  4. 发布
  5.   

我如何在Rails中创建这3个选项? (我被建议不要使用布尔值)

提前谢谢

3 个答案:

答案 0 :(得分:1)

在这个特定的例子中,它们看起来像状态标志可以通过几种方式处理,但是您已经询问了选择选项,所以这里是该方法的解决方案。

因为您没有指定是否需要保留表中已有的值,所以我详细介绍了一种方法,允许您通过将它们转换为ID(假设它们当前是字符串)来保留它们,如果这不相关然后只遵循大胆的指示。

创建PostStatus资源(模型,迁移,控制器/视图,如果您需要更改它们的能力)。

定义关系

PostStatus
  has_many :posts

Post
  belongs_to :post_status

向PostStatus表中添加值(如果表中包含字符串的实时系统,则应与此处的现有帖子状态字符串匹配,以便转换数据(详见下文)。 / p>

在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 %>

至少应该让你开始!

答案 1 :(得分: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

其中status是:string,limit:20(仅作为例子)在迁移中

或者您可以尝试使用https://github.com/jeffp/enumerated_attribute

答案 2 :(得分: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) %>