我无法通过外键访问相关模型的属性。
每个用户都有很多应用程序 每个申请都属于一所学校
当我尝试在用户仪表板(用户#show)中显示school_name属性时,我得到了一个未定义的school_name方法错误
应用程序有一个user_id和一个school_id,它应该作为外键。我当时认为这可能有问题,但找不到文档。
我可以调用@ application.school_id并返回正确的整数值,但学校表上的相关属性无法恢复。
非常感谢任何帮助。
用户控制器
class UsersController < ApplicationController
before_filter :authenticate_user!
def show
@user = current_user
@applications = @user.applications :include => [:school_name]
end
end
用户模型
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
has_many :applications
has_many :editors, :through => :applications
has_and_belongs_to_many :schools
end
用户/ show.html.erb
<div class="hero-unit">
<center><h1> Hello <%= @user.name %></h1></center>
<%= link_to "New Application", new_application_path %>
<h2>
Current Applications
</h2>
<%@applications.each do |app|%>
<%= app.school_name %>
<%end%>
</div>
应用程序模型
require 'carrierwave'
class Application < ActiveRecord::Base
mount_uploader :app_file, ImageUploader
belongs_to :user, :class_name => User, :foreign_key => "user_id"
belongs_to :school, :class_name => School, :foreign_key => "school_id"
belongs_to :editor
end
答案 0 :(得分:3)
对于能够直接调用school_name的应用程序,您必须通过委托调用告诉它在哪里查看。否则(如在另一个答案中)你必须拼出关联路径。我将避开整个Demeter角度定律(除了提到之外),并且只是说当一个关联模型属性的调用经常发生时,委托可以非常方便。
例如
class Application
belongs_to :school, :class_name => School, :foreign_key => "school_id"
delegate :school_name, :to => :school
...
end
具有在应用程序上调用.school_name被视为.school.school_name
的效果答案 1 :(得分:2)
更改
<%= app.school_name %>
到
<%= app.school.school_name %>
以下是协会的工作方式:
如果用户有许多应用程序且每个应用程序都属于学校,则可以从用户对象中检索应用程序:
user.applications
和每个申请的学校通过:
application.school
school
,这里是整个对象。要检索基础属性,您必须查询来自school
对象而不是application
答案 2 :(得分:-1)
school_name不应该是school.name吗?