【问题标题】:Accessing another table's attributes with a foreign key and belongs_to association使用外键和 belongs_to 关联访问另一个表的属性
【发布时间】:2013-11-05 18:07:20
【问题描述】:

我无法通过外键访问相关模型的属性。

每个用户都有许多应用程序 每个应用程序属于一所学校

当我尝试在用户仪表板 (user#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

【问题讨论】:

    标签: ruby-on-rails activerecord foreign-key-relationship composite-primary-key


    【解决方案1】:

    为了让应用程序能够像这样直接调用 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 的效果

    【讨论】:

      【解决方案2】:

      改变

      <%= app.school_name %>
      

      <%= app.school.school_name %>
      

      以下是关联的工作方式:

      如果用户有很多应用程序并且每个应用程序都属于一所学校,您可以从用户对象中检索应用程序:

      user.applications
      

      以及每个申请的学校:

      application.school 
      

      school,这里是整个对象。要检索基础属性,您必须从 school 对象而不是 application 查询这些属性

      【讨论】:

        【解决方案3】:

        school_name 不应该是 school.name 吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-13
          • 1970-01-01
          • 1970-01-01
          • 2015-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多