find in model

Hi guys

My client asked me to do all the Model.find() in Model class i.e all database interaction should be in model class and not in controller
I don’t know how to do that

I need to pass details from html to model and do database work and send back to view

I need some help

Any sample link or any advice ?

Quoting karthik k <cse.k.karthik@gmail.com>:

Hi guys

My client asked me to do all the Model.find() in Model class i.e all
database interaction should be in model class and not in controller
I don't know how to do that

I need to pass details from html to model and do database work and send back
to view

I need some help

Any sample link or any advice ?

Uhh, get a new client? If the client knows enough to dictate that level of
programming, either they don't need you or you don't need them.

But less cynically, ask them what they are trying to accomplish by this. Some
guru told them the "One True Way"? It may be reasonable to require all SQL be
in the model class. The whole purpose of the find() method is to program
database access in Ruby without knowing SQL.

The crude, ask no questions response is to take pluck out every find() call
and a reasonable amount of context in the controller and wrap it in a method
in the model and call that.

But, I would really try and get some clarification on why and what they expect
to accomplish by this change. On the face of it, it seems very unreasonable.

HTH,
  Jeffrey

Karthik Kantharaj wrote:

Hi guys

My client asked me to do all the Model.find() in Model class i.e all
database interaction should be in model class and not in controller
I don't know how to do that

I need to pass details from html to model and do database work and send
back
to view

I need some help

Any sample link or any advice ?

--
Karthik.k
Mobile - +91-9894991640

Write class methods in Model. Call those from Controllers by passing the
arguments.

controller method

def example
  User.method_name(arg1,arg2)
end

In User Model

def self.method_name(parm1,param2)
  write your find here
end

Thanks
Siva

Hi Jeffrey

thank you

we have lot of database interaction in the controller

e.g

def searchagency
@status=params[:status] #@status

@agency=params[:agency][:agency_id]       #@agency
@contract=params[:agency][:contracts_id]  #@contract 
@state=params[:agency][:state_id]         #@state
  if @status=='deleted'
    if !@contract.blank? && !@state.blank? && @agency.blank?

        @agencies=Agency.all(:joins=>:contracts,
        :select=>"distinct agencies.*",:conditions=>["contract_id = ? and agencies.state_id =? and agencies.deleted=?",@contract,@state,1])

        render :partial=>"agencysearchdisplay" 
    elsif !@agency.blank?  && !@state.blank? && @contract.blank?       

        @agencies=Agency.all(:joins=>:contracts,

etc

The above method is in controller so i need to write all the below code in model

if !@contract.blank? && !@state.blank? && @agency.blank?

        @agencies=Agency.all(:joins=>:contracts,

        :select=>"distinct

agencies.*",:conditions=>[“contract_id = ? and agencies.state_id =?
and agencies.deleted=?”,@contract,@state,1])

        render :partial=>"agencysearchdisplay" 

    elsif !@agency.blank?  && !@state.blank? && @contract.blank?       

        @agencies=Agency.all(:joins=>:contracts,

and just retrieve the result and display in html
I need to write a method in model and access it from controller

This is what we need

Guide me

Hi Guys

Thank you

Quoting karthik k <cse.k.karthik@gmail.com>:
[snip]

Hi Jeffrey

thank you

we have lot of database interaction in the controller

e.g

def searchagency
    @status=params[:status] #@status
    @agency=params[:agency][:agency_id] #@agency
    @contract=params[:agency][:contracts_id] #@contract
    @state=params[:agency][:state_id] #@state
      if @status=='deleted'
        if !@contract.blank? && !@state.blank? && @agency.blank?
            @agencies=Agency.all(:joins=>:contracts,
            :select=>"distinct agencies.*",:conditions=>["contract_id = ?
and agencies.state_id =? and agencies.deleted=?",@contract,@state,1])
            render :partial=>"agencysearchdisplay"

[snip]
Use named scopes:

def searchagency
  @status=params[:status] #@status
  @agency=params[:agency][:agency_id] #@agency
  @contract=params[:agency][:contracts_id] #@contract
  @state=params[:agency][:state_id] #@state
  if @status=='deleted'
    @agencies = Agency.all_deleted(@contract, @state)
    if !@contract.blank? && !@state.blank? && @agency.blank?
      render :partial=>"agencysearchdisplay

in model class

  named_scope :all_deleted, lambda {|contract, state|
    {:joins => :contracts,
     :select => "distinct agencies.*",
     :conditions =>
         ["contract_id = ? AND agencies.state_id =? AND agencies.deleted=?",
     contract, state, 1]
  }

HTH,
  Jeffrey

Hi Jeffrey

Thank you
i will learn about named_scope

Quoting karthik k <cse.k.karthik@gmail.com>:
[snip]

Hi Jeffrey

Thank you
i will learn about named_scope

There is an excellent Railscast on named_scope. My Internet connection won't
stay up long enough to check, but I think the URL is www.railscast.com.

Jeffrey

Quoting karthik k <cse.k.karthik@gmail.com>:
[snip]

Thank you
i will learn about named_scope

URL of Railscast is http://railscasts.com/. Episode 108.

Hi Guys

I tried to use named_scope and i am successful in doing that

I need to know one thing about self

Below used in definition

Model Employee

Below used in definition

Model Employee
--------------
def self.list
find(:all)
end

In some case it is used inside

Model Employee
--------------
def list
self.find(:all)
end

So please let me know what is the reason behind this, using in two different
way

self is the implicit receiver, ie calling self.find(:all) is the same
as calling find(:all). Sometimes it is useful to make it obvious what
you are doing

def self.list
...
end

creates a class method. The second example you gave probably wouldn't
run, unless the model had an instance method called find. More likely
is that you find something like that inside a

class << self
  def list
    ...
  end
end

in which case it is identical to the first example

Fred

Model Employee
--------------
def self.list
find(:all)
end

This is a class method inside Employee Model. it can also be written as

  def Employee.list
    find(:all)
  end

This kind of methods can be called without the instance of the Model
class.

In some case it is used inside

Model Employee
--------------
def list
self.find(:all)
end

This one is Instance method of Model class Employee