0

少し前に選択オプションについて同様の質問をしましたが、まだ頭を抱えているようには見えません。私はレールにかなり慣れていませんが、これが私がやろうとしていることです

Post テーブルがあり、その中に「post_status」列があります。各投稿に 3 つのオプションを指定したいと思います。

  1. 下書き
  2. 保留中
  3. 公開

Railsでこれら3つのオプションを作成するにはどうすればよいですか? (これにはブール値を使用しないようにアドバイスされました)

前もって感謝します

4

3 に答える 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) %>

于 2013-06-13T01:09:31.973 に答える
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 %>

これで少なくとも始められるはずです。

于 2013-06-13T00:17:04.117 に答える