前一段时间我问了一个关于选择选项的类似问题,但我似乎仍无法绕过它。我对铁杆很新,但这就是我要做的事情
我有一张Post table&在其中,我有一个“ post_status ”列。一世 我想给每个帖子3个选项:
- 草案
- 待
- 发布
醇>
我如何在Rails中创建这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(仅作为例子)在迁移中
答案 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) %>