我有三种模式: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。
答案 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视图中的代码更新您的问题,并阐明您要实现的目标。