ruby on rails关系不起作用

时间:2017-05-21 13:24:17

标签: ruby-on-rails ruby

我正在尝试访问两个模型之间的所有关系:Serie有多个类别,多个类别可以是不同的系列。是多对多的关系。

我尝试执行以下操作:

class SeriesController < ApplicationController

   def category
      @category = params[:category]
      @series = []

      Serie.all.each do |serie|
         @serie.categories.all.each do |cat|
            if @cat.category == @category
               @series << @serie
            end
         end
      end
   end

end

Rails抛出了我的异常:

undefined method `categories' for nil:NilClass

以下是模型:

class Serie < ApplicationRecord
  has_many :types
  has_many :categories, through: :types
end

class Type < ApplicationRecord
  belongs_to :serie
  belongs_to :category
end

class Category < ApplicationRecord
  has_many :types
  has_many :series, through: :types
end

class CreateCategories < ActiveRecord::Migration[5.1]
  def change
     create_table :categories do |t|
      t.string :category
      t.timestamps
    end
  end
end

class CreateTypes < ActiveRecord::Migration[5.1]
  def change
    create_table :types do |t|
      t.references :serie, index: true
      t.references :category, index: true
      t.timestamps
    end
  end
end

我不知道为什么这不起作用。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:3)

更改

Serie.all.each do |serie|
  @serie.categories.all.each do |cat|
     if @cat.category == @category
       @series << @serie
     end
     # ...

Serie.all.each do |serie|
  serie.categories.all.each do |cat|
     if cat.category == @category
       @series << serie
     end
     # ...

因为块中定义了局部变量seriecat,但没有实例变量@serie@cat

答案 1 :(得分:1)

您正在使用create方法混合变量。你引用@serie设置为等于[]所以在每个它是空的时候,你在那里创建的变量是serie所以使用它。

....
      Serie.all.each do |serie|
      serie.categories.all.each do |cat|
        if cat.category == @category
           @series << serie
        end
     end
  end