1

関連モデルの属性に外部キーでアクセスできません。

各ユーザーには多くのアプリケーションがあり、各アプリケーションは 1 つの学校に属しています

ユーザー ダッシュボード (user#show) で school_name 属性を表示しようとすると、school_name の未定義メソッド エラーが発生します。

アプリケーションには、外部キーとして機能する user_id と school_id があります。これに問題があるのではないかと思っていましたが、ドキュメントが見つかりませんでした。

@application.school_id を呼び出すと、正しい整数値が返されますが、school テーブルの関連する属性は取得できません。

どんな助けでも大歓迎です。

ユーザーコントローラー

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
4

3 に答える 3

3

アプリケーションが school_name をそのように直接呼び出せるようにするには、デリゲート呼び出しでどこを見るかを指定する必要があります。それ以外の場合(他の回答のように)、関連付けパスを綴る必要があります。デメテルの法則の角度全体 (その言及は別として) を避け、関連付けられたモデルの属性への呼び出しが頻繁に発生する場合、委譲は非常に便利であるとだけ述べておきます。

例えば

class Application
  belongs_to :school, :class_name => School, :foreign_key => "school_id"
  delegate :school_name, :to => :school
  ...
end

アプリケーションで .school_name を呼び出すと、.school.school_name として扱われるという効果があります。

于 2013-11-05T18:17:32.327 に答える