Accessing another model's attributes

19 views
Skip to first unread message

Aida Delic

unread,
Feb 12, 2017, 6:29:26 AM2/12/17
to Ruby on Rails: Talk

Hi :) 

 

I'm new to Rails. I'm trying to make an app where students can login in and signup for the exam. I have a problem filtering data, where a student can only see exams which belong to her/his year and department. 

 

Subject has the following columns:

    t.string  "name"
    t.integer "ects"
    t.integer "year"
    t.integer "professor_id" (foreign key which relates it to professor). 
 
Its relationship with exam: 
has_one :exam 
 
Exam has the following columns:
    t.date    "start_date"
    t.string  "department"
    t.integer "professor_id"
    t.integer "subject_id"  
 
Its relationship with exam: 
 belongs_to :subject 
 
User has attributes year (year of study) and department. The problem is that exam only has depatment, but it doesn't have year. 
 
I have made this in exam.rb 
 
scope :department, -> (department) { where('department == ?', department) }
scope :year, -> (year) { where('subject.year == ?', year) } 
 
Then I called these methods in exams controller (index action) and passed the data:
 
 @exams = Exam.department(current_user.department) && Exam.year(current_user.year)
 
There is a problem with a scope year, it doesn't recognize subject. When I try to access the list of exams it says this: 
SQLite3::SQLException: no such column: subject.year: SELECT "exams".* FROM "exams" WHERE (subject.year == 2)
 
But when I include subject_id:  scope :year, -> (year) { where('Subject.find(:subject_id).year == ?', year) }
It says there is a syntax error: SQLite3::SQLException: near "(": syntax error: SELECT "exams".* FROM "exams" WHERE (Subject.find(:subject_id).year == 2). 
 
I have tried accessing subject attributes by using delegate and to_params, but it didn't help. I've been googling this issue for more than 10 days, but I haven't been able to find a solution. 
 
I appreciate any kind of help. Thanks in advance :) 
 
 

 

nanaya

unread,
Feb 12, 2017, 6:36:22 AM2/12/17
to rubyonra...@googlegroups.com
Hi,
scope :year, -> (year) { where(subject: Subject.where(year: year)) }

Frederick Cheung

unread,
Feb 13, 2017, 9:36:41 AM2/13/17
to Ruby on Rails: Talk


On Sunday, February 12, 2017 at 11:29:26 AM UTC, Aida Delic wrote:

 

scope :department, -> (department) { where('department == ?', department) }
scope :year, -> (year) { where('subject.year == ?', year) } 
 
Then I called these methods in exams controller (index action) and passed the data:
 
 @exams = Exam.department(current_user.department) && Exam.year(current_user.year)
 
There is a problem with a scope year, it doesn't recognize subject. When I try to access the list of exams it says this: 
SQLite3::SQLException: no such column: subject.year: SELECT "exams".* FROM "exams" WHERE (subject.year == 2)
 
But when I include subject_id:  scope :year, -> (year) { where('Subject.find(:subject_id).year == ?', year) }
It says there is a syntax error: SQLite3::SQLException: near "(": syntax error: SELECT "exams".* FROM "exams" WHERE (Subject.find(:subject_id).year == 2). 
 
I have tried accessing subject attributes by using delegate and to_params, but it didn't help. I've been googling this issue for more than 10 days, but I haven't been able to find a solution. 


Delegate,to_params etc. are all rails things, that your database server (or in this case sqlite) doesn't understand. You need to do a join between the two tables, which will result in columns from both tables being available. Rails can help you write those joins (since you have told it about your relationships), but you should understand what those joins are. For example you can do

Exam.joins(:subject).where(subjects: {year: 2}) 

Note that the joins clause use :subject (the name of the association) whereas the where clause uses subjects (the name of the table). You can also supply a raw fragment of sql for the join if you want a different one to what rails generates by default (a left join in this case).

Fred

Reply all
Reply to author
Forward
0 new messages