少し前に選択オプションについて同様の質問をしましたが、まだ頭を抱えているようには見えません。私はレールにかなり慣れていませんが、これが私がやろうとしていることです
Post テーブルがあり、その中に「post_status」列があります。各投稿に 3 つのオプションを指定したいと思います。
- 下書き
- 保留中
- 公開
Railsでこれら3つのオプションを作成するにはどうすればよいですか? (これにはブール値を使用しないようにアドバイスされました)
前もって感謝します
少し前に選択オプションについて同様の質問をしましたが、まだ頭を抱えているようには見えません。私はレールにかなり慣れていませんが、これが私がやろうとしていることです
Post テーブルがあり、その中に「post_status」列があります。各投稿に 3 つのオプションを指定したいと思います。
- 下書き
- 保留中
- 公開
Railsでこれら3つのオプションを作成するにはどうすればよいですか? (これにはブール値を使用しないようにアドバイスされました)
前もって感謝します
@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) %>
この特定の例では、いくつかの方法で処理できるステータス フラグのように見えますが、選択オプションについて尋ねられたので、その方法の解決策を次に示します。
すでにテーブルに値を保持する必要があるかどうかを指定していないため、値を 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 %>
これで少なくとも始められるはずです。