Rails多态关联错误

时间:2013-03-05 20:23:19

标签: ruby-on-rails ruby-on-rails-3 polymorphic-associations polymorphism

我遇到多态关联问题。

关于我的项目的快速解释。你可以在这里看到:majorfinder.com在我的应用程序上将有专业,学校和职业。我希望能够为每个人添加评论。由于我刚刚开始,我刚刚开始为专业添加评论,但创建了关联,这样当我进入职业和学校时,评论协会将很快进行。

以下是我的协会:

models / review.rb

belongs_to :user
belongs_to :reviewable, polymorophic: true

模型/ user.rb

has_many :reviews

模型/ major.rb

has_many :reviews, as: :reviewable

我的评论数据库架构如下所示:

create_table "reviews", :force => true do |t|
    t.text     "review"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.integer  "user_id"
    t.integer  "reviewable_id"
    t.string   "reviewable_type"
  end

在我的专业控制器中,我跟着this railscast创建了一个类似于www.majorfinder.com/majors/major-name的网址。所以我的专业控制器的一部分看起来像这样:

def show
    @major = Major.find_by_slug(params[:id]).includes(:reviews => :user)
end 

在我的专业展示页面中,我有:

<% @reviews.each do |review| %>
    <div>
      <h3><%= link_to review.review,
        :controller => "reviews", :action => "show", :id => review.id %></h3>
      <small>Posted on <%= review.created_at %> by
        <a href="#"><%= review.user.profile_name %></a></small>
    </div>
  <% end %>

最后,这是我的路线:

resources :majors, has_many: :reviews

我收到以下错误:

NoMethodError in MajorsController#show

undefined method `includes' for #<Major:0x007f9466e001a8>

这是来自控制台:

Started GET "/majors/statistics" for 127.0.0.1 at 2013-03-05 07:45:01 -0700
Processing by MajorsController#show as HTML
  Parameters: {"has_many"=>:reviews, "id"=>"statistics"}
  Major Load (24.2ms)  SELECT "majors".* FROM "majors" WHERE "majors"."slug" = 'statistics' LIMIT 1
  CACHE (0.0ms)  SELECT "majors".* FROM "majors" WHERE "majors"."slug" = 'statistics' LIMIT 1
Completed 500 Internal Server Error in 28ms

NoMethodError (undefined method `includes' for #<Major:0x007f8ad51fdd00>):
  app/controllers/majors_controller.rb:16:in `show'

majors_controller.rb文件中的第16行是这一行:

@major = Major.find_by_slug(params[:id]).includes(:reviews => :user)

你能看到我失踪的东西或我应该改变的东西吗?似乎解决方案很简单,但我不确定它是什么。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我相信当你找到Major时,你想要做的就是急切加载:reviews。你很近但你的订单倒退了。它必须是

@major = Major.includes(:reviews => :user).find_by_slug(params[:id])

有关预先加载结帐的详细信息,请参阅此RailsGuides文章。