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

(我不确定让两列的含义完全相反是否是一种不好的做法,但它使“发布”模型中的回调更清晰。如果我错了,请纠正我)。

现在我想找到一种获取草稿和非草稿(已发布)帖子的方法。现在,我只知道如何按发布日期对它们进行排序。但我不知道如何用draft == trueor过滤掉帖子published == false

post_controller.rb:

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

这样做的最佳方法是什么?

(顺便问一下,我应该使用order还是order_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 回答