1

列のあるPostモデルがありdraftます。ユーザーがビューのチェックボックスをクリックすると、投稿は次のようにチェックされますdraft

スキーマ.rb:

create_table "posts", :force => true do |t|
    t.string   "title"
    t.string   "content"
    t.integer  "user_id"
    t.datetime "created_at",                            :null => false
    t.datetime "updated_at",                            :null => false
    t.integer  "comments_count",     :default => 0,     :null => false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
    t.boolean  "published",          :default => false
    t.datetime "published_at"
    t.boolean  "draft",              :default => false
  end

つまり、公開されているとは見なされません。

post.rb:

  def publish_post
    unless self.draft == true
     self.published = true
     self.published_at = Time.now
    end
  end

(互いに正反対の意味を持つ 2 つの列を使用することが悪い習慣であるかどうかはわかりませんが、「Post」モデルのコールバックがより明確に読み取れるようになります。間違っている場合は修正してください)。

ここで、ドラフトとドラフト以外の (公開された) 投稿を取得する方法を見つけたいと考えています。今のところ、公開日で並べ替える方法しか知りません。draft == trueしかし、またはで投稿を除外する方法がわかりませんpublished == false

posts_controller.rb:

 def index
    @posts = Posts.order('published_at DESC')
  end

これを行う最善の方法は何ですか?

(ちなみに、使うべきorderorder_by?、違いは何ですか?)

4

2 に答える 2

2

下書きではない投稿だけを取得するには:

@posts = Posts.where(:draft => false).order('published_at DESC')
于 2012-10-20T06:28:43.783 に答える
1

ActiveRecord スコープを使用してこれを行うこともできます。これにより、すべての下書き投稿をより適切にクエリできます。

class Post < ActiveRecord::Base
   #Create a scope for draft
   scope :draft, where(:draft => true)
end

次に、コントローラーで、次のようなすべての下書き投稿を見つけることができます。

Post.draft

ここでスコープの詳細を読むことができます http://guides.rubyonrails.org/active_record_querying.html#scopes

于 2012-10-20T06:34:18.967 に答える