如何在Ruby on Rails中列出具有特定值的所有对象?

时间:2016-03-08 00:16:29

标签: ruby-on-rails ruby database ruby-on-rails-3 rails-activerecord

我正在制作一个页面,该页面将列出包含' 1'的所有模型。 for:category_id,这里是自己的页面摘录

<h1>Discover the best of Games</h1>
<p>These are games we have featured and awarded</p>
<% @posts.find_by(category_id: 1) do |post| %>
  <h2>
    <%= link_to post.title, post %>
  </h2>
<% end %>

注意@ posts.find_by(category_id:1)do | post |显然是错的。它不会显示任何帖子,而是会出现undefined method find_by&#39;的错误。为nil:NilClass`所以是的,我知道.find_by不正确。这很明显。

这里是Schema.rb和post_controller.rb的片段

模式

  create_table "categories", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "posts", force: :cascade do |t|
    t.string   "title"
    t.text     "description"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "category_id"
  end

  add_index "posts", ["category_id"], name: "index_posts_on_category_id"

Posts_controller(整件事)

class PostsController < ApplicationController
    before_action :find_post, only: [:show, :edit, :update, :destroy]

    def index
        @posts = Post.all.order("created_at DESC")
    end

    def show
    end

    def new
        @post = Post.new
    end

    def create
        @post = Post.new(post_params)

        if @post.save
          redirect_to @post, notice: "Successfully created"
        else
          render 'new'
        end
    end

    def edit
    end

    def update
        if @post.update(post_params)
            redirect_to @post, notice: "Post was successfully updated"
        else
            render 'edit'
        end
    end

    def destroy
        @post.destroy
        redirect_to root_path
    end

    private

    def post_params
        params.require(:post).permit(:title, :description, :category_id)
    end

    def find_post
        @post = Post.find(params[:id])
    end

end

任何帮助都会受到高度赞赏,因为我对Rails很新,只是掌握了基础知识。感谢。

2 个答案:

答案 0 :(得分:4)

编辑:

print s.DIAttribute.prettify('ascii')
print s.DIAttribute.prettify('windows-1252')
print s.DIAttribute.prettify('ansi')
print s.DIAttribute.prettify('utf-8')
print s.DIAttribute['value'].replace('\r','&#xD;').replace('\n','&#xA;')  #This works, but it feels like a bandaid and will likely other problems will remain.

所以:

Post.where(category_id: 1)

当您需要单个对象时,更多地使用<% Post.where(category_id: 1).each do |post| %> <h2> <%= link_to post.title, post %> </h2> <% end %> 。如果您想要一组基于一组条件的对象,请使用where。此外,find_by可以根据您的模型所具有的字段来解析find_by之类的方法,因此find_by_category_idPost.find_by_title会神奇地起作用。同样,我在这些情况下使用Post.find_by_description,但只是注意参考。

假设你的模型设置得恰当,做同样事情的另一种方法是:

where

这将列出类别1中的所有帖子。这可能比Category.find(1).posts 更明确,并且此版本的优势在于是否有关于您希望在页面上显示的类别的信息,例如类别名称。然后你已经有了这个对象:

Post.where

无论如何,希望能让所有事情变得更清晰,更加清晰。

答案 1 :(得分:0)

您可以使用join关联

def index
  @posts = Post.joins(:category).where('posts.category_id = ?', 1).order("posts.created_at DESC")
end

或者如果你想避免N + 1,你可以使用includes

def index
  @posts = Post.includes(:category).where('posts.category_id = ?', 1).order("posts.created_at DESC")
end

我希望这对你有所帮助。