我正在尝试访问两个模型之间的所有关系: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
我不知道为什么这不起作用。
有什么想法吗?感谢。
答案 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
# ...
因为块中定义了局部变量serie
和cat
,但没有实例变量@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