Keep getting syntax error

Hey all,

I keep getting a syntax error somewhere in this code. Thanks for all
help.

class StudentState < ActiveRecord::Base
has_many :students
end

class Student < ActiveRecord::Base
belongs_to :student_state
named_scope :filtertabs, :join => :student_state, lambda { |*args|
{:conditions => {‘student_state.id => ?’, args}} }
end

class StudentsController < ApplicationController
before_filter :get_status

def index
@list = student.find(:all)
render :xml => @list
end

def filter
@students = @student_state.students.filtertabs.find(:all)
render :xml => @students
end

def get_status
@student_state = StudentState.find(params[:id])
end

On Jan 12, 2:25Â pm, John M. [email protected] wrote:

{:conditions => {‘student_state.id => ?’, args}} }

This is wrong - I assume you meant ‘student_state.id’ => args

Fred

Frederick C. wrote:

On Jan 12, 2:25Â pm, John M. [email protected] wrote:

{:conditions => {‘student_state.id => ?’, args}} }

This is wrong - I assume you meant ‘student_state.id’ => args

Fred

After I change it to:

named_scope :filtertabs, :join => :student_state, lambda { |*args|
{:conditions => {‘student_state.id’ => args}} }

I still get a syntax error.

On Jan 12, 3:15Â pm, John M. [email protected] wrote:

Frederick C. wrote:

After I change it to:

named_scope :filtertabs, :join => :student_state, lambda { |*args|
{:conditions => {‘student_state.id’ => args}} }

I still get a syntax error.

Your lambda should return a single hash with all the query options you
want. (and its :joins not :join)

Fred

On Jan 12, 4:58Â pm, John M. [email protected] wrote:

Your lambda should return a single hash with all the query options you
want. (and its :joins not :join)

Fred

Isn’t it returning a single hash here?

No it isn’t - you’ve got the :join => :student_state and then you’ve
got the lambda - you can’t mix and match the proc form of named_scope
with the non proc form: either you pass a hash to named_scope or you
give it a lambda - not both.

Fred

Frederick C. wrote:

On Jan 12, 3:15Â pm, John M. [email protected] wrote:

Frederick C. wrote:

After I change it to:

named_scope :filtertabs, :join => :student_state, lambda { |*args|
{:conditions => {‘student_state.id’ => args}} }

I still get a syntax error.

Your lambda should return a single hash with all the query options you
want. (and its :joins not :join)

Fred

Isn’t it returning a single hash here?
@student_state = StudentState.find(params[:id])

Frederick C. wrote:

On Jan 12, 4:58Â pm, John M. [email protected] wrote:

Your lambda should return a single hash with all the query options you
want. (and its :joins not :join)

Fred

Isn’t it returning a single hash here?

No it isn’t - you’ve got the :join => :student_state and then you’ve
got the lambda - you can’t mix and match the proc form of named_scope
with the non proc form: either you pass a hash to named_scope or you
give it a lambda - not both.

Fred

Well, I changed it around. I think this is what you were talking about:

class StudentState < ActiveRecord::Base
has_many :students
end

class Student < ActiveRecord::Base
belongs_to :student_state
named_scope :status, :joins => :student_state, => {‘student_state.state’
=> ?, :state}
end

class StudentsController < ApplicationController

before_filter :get_state

def index
@list = student.find(:all)
render :xml => @list
end

def filter_show
@student_state.student.status(:state)
#This is the students associated with a student state and based on which
value they click on, we will return that value into the status
named_scope, which will set it and then only return the students of the
student_status which has a value of that specific state (e.g.
passing/failing)
end

def get_state
@student_state= StudentState.find(params[:all])
#All of the attributes of student_state model (e.g. status attribute and
values of passing/failing)
end

All I was trying to do was where a user clicks on one of options in a
filter, such as passing, then it will return the list of students who
are passing. My undertanding is this could be done in named_scope.

John M. wrote:

Frederick C. wrote:

On Jan 12, 4:58Â pm, John M. [email protected] wrote:

Your lambda should return a single hash with all the query options you
want. (and its :joins not :join)

Fred

Isn’t it returning a single hash here?

No it isn’t - you’ve got the :join => :student_state and then you’ve
got the lambda - you can’t mix and match the proc form of named_scope
with the non proc form: either you pass a hash to named_scope or you
give it a lambda - not both.

Fred

Well, I changed it around. I think this is what you were talking about:

class StudentState < ActiveRecord::Base
has_many :students
end

class Student < ActiveRecord::Base
belongs_to :student_state
named_scope :status, :joins => :student_state, => {‘student_state.state’
=> ?, :state}
end

class StudentsController < ApplicationController

before_filter :get_state

def index
@list = student.find(:all)
render :xml => @list
end

def filter_show
@student_state.student.status(:state)
#This is the students associated with a student state and based on which
value they click on, we will return that value into the status
named_scope, which will set it and then only return the students of the
student_status which has a value of that specific state (e.g.
passing/failing)
end

def get_state
@student_state= StudentState.find(params[:all])
#All of the attributes of student_state model (e.g. status attribute and
values of passing/failing)
end

All I was trying to do was where a user clicks on one of options in a
filter, such as passing, then it will return the list of students who
are passing. My undertanding is this could be done in named_scope.

Actually, ignore above. This to me makes sense as to how it should work:

class StudentState < ActiveRecord::Base
has_many :students
end

class Student < ActiveRecord::Base
belongs_to :student_state
named_scope :status, :joins => :student_state, => {‘student_state.state’
=> ? = student_state.students.state_id, :state}
end

class StudentsController < ApplicationController

before_filter :get_state

def index
@list = student.find(:all)
render :xml => @list
end

def filter_show

@filter = @student_state.students.status(:state) #This is the students
associated with a student state and based on which value they click on,
we will return that value into the status named_scope, which will set it
and then only return the students of the student_status which has a
value of that specific state (e.g. passing/failing)
end
render :xml => @filter
end
def get_state
@student_state= StudentState.find(:all) #All of the attributes of
student_state model (e.g. status attribute and values of
passing/failing)
end

Frederick C. wrote:

On 12 Jan 2010, at 18:46, John M. wrote:

=> ?, :state}
end

Not quite - since you’ve got a parameter you have to use the lambda form
(when I said you had to use the hash form or the lambda form I was
talking in generalities), so you need

named_scope :status, lambda {|…| { :conditions => …, :joins => … }

Fred

named_scope :status, lambda { |key|
{ :joins => :student_state, :conditions => [“student_state.key = ?”,
key], :limit => 20 }
}

The above ended up working. However, I thought that the inner join I
specified would make the attributes of student_state available in the
xml output of the students controller (when going to the url
http://localhost:3000/students.xml). But it wasn’t. Is this a limitation
of rail’s xml capabilities?

On 12 Jan 2010, at 18:46, John M. wrote:

=> ?, :state}
end

Not quite - since you’ve got a parameter you have to use the lambda form
(when I said you had to use the hash form or the lambda form I was
talking in generalities), so you need

named_scope :status, lambda {|…| { :conditions => …, :joins => … }

Fred

On Jan 13, 2:06Â pm, John M. [email protected] wrote:

The above ended up working. However, I thought that the inner join I
specified would make the attributes of student_state available in the
xml output of the students controller (when going to the urlhttp://localhost:3000/students.xml). But it wasn’t. Is this a limitation
of rail’s xml capabilities?

The :joins / :includes specified when you fetch rows have no bearing
on xml (or json etc) output, however to_xml does accept options that
allow you to do that sort of stuff.

Fred