我整天都在绞尽脑汁,不能让这个工作起来。我对ruby和rails很新,所以我为任何愚蠢的错误道歉。
我的问题是我一起加入3个表来获取@students对象。这有效,但如果我打电话给例如@ student.name,则'name'不存在。
以下是我的代码:
控制器 请注意我尝试使用.includes和.join,同样的问题也会发生。
class MyprojectController < ApplicationController
def show
@project = Project.find(params[:id])
@dateformat = '%b %e - %H:%M'
@user = Student.includes("INNER JOIN researchers ON students.researcher_id = researchers.id
INNER JOIN users ON researchers.user_id = users.id").where('user_id = ?', current_user.id)
end
用户模型
class User < ApplicationRecord
include EpiCas::DeviseHelper
has_many :event_registrations
has_many :events, through: :event_registrations
belongs_to :project
has_many :researchers
#has_many :students, :through => :researchers
#has_many :supervisors, :through => :researchers
# def self.authenticate(username)
# where(username: username).first
# end
端
研究员模型
class Researcher < ApplicationRecord
#belongs_to :project
belongs_to :user
has_many :supervisor
has_many :students
end
学生模特
class Student < ApplicationRecord
#Must have the following
validates :name, :email, :surname, :email, :supervisor, :registration_number, presence: true
#ensures unique email addresses
validates :email, uniqueness: true
#assosiations
belongs_to :researcher
end
所以每个学生都有一个researchar_id,每个研究人员都有一个user_id。因此,连接应该是student-&gt; researcher-&gt;用户,然后我希望能够使用@user对象中所有表的所有属性。
我尝试使用Student.join(:研究员,用户),但是尝试从Student表到研究人员表进行连接,然后尝试使用student表中的user_id加入用户表(但是user_id在研究员表中)。所以我自己刚刚完成了查询。
所有数据似乎都在那里,但作为'原始属性'。
非常感谢任何帮助!
-James
答案 0 :(得分:1)
使用includes
而不是尝试将事物加入到一个返回中(就像在sql中一样),这样您就可以在更少的查询中访问所有数据,但仍然可以访问对象中的数据。使用像ActiveRecord这样的ORM的关键是能够使用对象访问您的数据。使用ORM的缺点是,有时它不能提供您想要的确切数据,因为数据正在推入对象。使用includes
提供了一种中间立场,您可以在其中访问对象中所需的数据,而不必为每个关联运行查询。
尝试类似的东西(取决于你获得用户ID的方式 - 我从项目中假设):
@user = User.includes(researcher: :student).find(project.user_id)
然后你可以通过普通的rails协会访问:
researcher = @user.researcher
student = researcher.student
我希望有所帮助,祝你好运!