1

У меня есть три модели: Thing, Category и Rating. Вещи и категории имеют друг друга друг от друга: через: category_things, но только категория has_many Ratings, через: category_ratings. Я хочу поставить @ thing.categories.ratings в моем представлении Thing, но я не могу понять, как определить его в контроллере Things. Вот что я пытался до сих пор:Rails: Как определить подмодуль одной модели в контроллере третьей модели?

class ThingsController < ApplicationController 
    def show 
    @thing = Thing.find(params[:id]) 
    @category = Category.all 
    @thing.categories.build 
    @category_thing = CategoryThing.all 
    @category_rating = CategoryRating.all 
    @rating = Rating.all 
    @thing.categories.ratings.build 
    end 
end 

Но когда я иду в Thing/шоу точки зрения, я получаю следующее сообщение об ошибке:

undefined method 'ratings' for #<ActiveRedord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Category:0xb34c6d24> 

вещь Модель:

class Thing < ActiveRecord::Base 
    has_many :category_things 
    has_many :categories, :through => :category_things 
    attr_accessor :category_names 
    has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "30x30!" }, :default_url => "/images/:style/missing.png" 
    validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/ 
end 

Категория Модель:

class Category < ActiveRecord::Base 
    has_many :category_ratings 
    has_many :ratings, :through => :category_ratings 
    has_many :category_things 
    has_many :things, :through => :category_things 
end 

Категория: Модель:

class CategoryThing < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :thing 
end 

Рейтинг модели:

class Rating < ActiveRecord::Base 
    has_many :category_ratings 
    has_many :categories, :through => :category_ratings 
    has_many :thing_ratings 
    has_many :things, :through => :thing_ratings 
    has_many :up_votes 
    has_many :down_votes 
end 

CategoryRating Модель:

class CategoryRating < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :rating 
end 

Я использую Rails 4.0.10.

+0

Правильно. У одного объекта есть 'рейтинги', коллекция таких объектов нет. Подумайте о том, чтобы смотреть на «нетерпеливую загрузку». Этого недостаточно для ответа, это скорее направление поиска. –

+0

Я исследовал нетерпеливую загрузку, но я не уверен, как это может привести к решению моей проблемы. –

+0

покажите нам свои модели с их ассоциациями, пожалуйста. – Anthony

ответ

0

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html говорит, что вы можете помещать хэш в .include для более глубокой нетерпеливой загрузки.

Вы могли бы (не проверял, вам, возможно, придется играть с этим):

@thing = Thing.include({categories: :ratings}).find(params[:id]) 

Надежда, что помогает!

0

'@ thing.categories' - это прокси-объект, представляющий собой совокупность объектов. В сообщении об ошибке сообщается, что в коллекции нет методов 'рейтинги'. Только экземпляр категории может иметь рейтинги связанные с этим. Вам нужно сохранить экземпляр созданной категории, купите @ thing.categories.build, а затем получите свои оценки. Также я вижу несколько проблем с именами в вашем действии действия, которые я бы изменил, чтобы сделать намерение более ясным.

Попробуйте

@thing = Thing.find(params[:id]) 
    @categories = Category.all # All possible categories? 
    @category = @thing.categories.build # create a new category that belongs to this instance of 'thing' 
    @category_things = CategoryThing.all # All possible category_things? 
    @category_ratings = CategoryRating.all # All possible category_ratings? 
    @rating = Rating.all ## All possible ratings? 

Вы должны изменить свой вид шоу, чтобы отразить эти изменения. Я не знаю, что находится в вашем представлении на шоу, но я предполагаю, что, поскольку вы «создаете» категорию через ассоциации предметов, у вас должна быть форма (использующая вложенные атрибуты) на странице, которая при представлении на контроллер вещи фактически создаст категории. Если это не так, тогда вы должны обновить свой вопрос с помощью кода из представления просмотра и уточнить, чего вы пытаетесь достичь.

Смежные вопросы