Rails:如何在第三个模型的控制器中定义一个模型的子模型?

时间:2014-10-16 20:31:28

标签: ruby-on-rails ruby ruby-on-rails-4 controller associations

我有三种模式:Thing,Category和Rating。事物和类别每个都有彼此:通过:category_things,但只有类别has_many评级,:通过:category_ratings。我想把@ thing.categories.ratings放在我的Thing视图中,但我无法弄清楚如何在我的Things控制器中定义它。这是我到目前为止所尝试的内容:

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 / show视图时,我收到以下错误:

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

CategoryThing模型:

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。

2 个答案:

答案 0 :(得分:0)

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html告诉我你可以将哈希放入.include以进行更深入的加载。

你可以做(​​没有经过测试,你可能需要玩这个):

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

希望有所帮助!

答案 1 :(得分: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?

您必须修改您的节目视图才能反映这些变化。我不知道您的节目视图中有什么,但我认为,因为您通过事物关联“构建”类别,您必须在页面上有一个表单(即使用嵌套属性),当提交到事物控制器时将实际创建类别。如果不是这种情况,那么您应该使用show视图中的代码更新您的问题,并阐明您要实现的目标。