Kim
Kim

Reputation: 2156

retrieve data from database - hash

I have a table called audits which has a column 'changes' storing data in the form of hash

I would like to retrieve all entries with the following conditions:

- auditable_type = 'Expression'
- action = 'destroy'
- changes = { :EXP_SUBMISSION_FK =>'9999992642'}

I first tried the following code which returns me with nothing:

@deleted_history = Audit.find(:all, :conditions => ["auditable_type =? AND action = ? AND changes = ?",'Expression', 'destroy' , { :EXP_SUBMISSION_FK =>'9999992642'} ])

I then tried the following code which retrieves all entries in the 'audits' table with auditable_type = 'Expression' and action = 'destroy'.

I then loop through the resultset and discards all entries where EXP_SUBMISSION_FK is not equal to 9999992642. The code below returns me 5 entries/records

   @deleted_history = Audit.find(:all, :conditions => ["auditable_type =? AND action = ?",'Expression', 'destroy' ])
    @deleted_history.each do |test|
      if test.changes['EXP_SUBMISSION_FK'] != 9999992642
        @deleted_history = @deleted_history.reject { test }
      end
    end

I would like to know where did I go wrong with the first code example and whether there is a way of retrieving all entries with the aforementioned conditions in a much simpler way.

Thanks a lot for your help.

Upvotes: 0

Views: 223

Answers (2)

Mohanraj
Mohanraj

Reputation: 4200

You just use something like below. I am storing element_values as a hash and i am selecting records based on the key/value pair.

scope :find_by_field_values, lambda {
  |field_name, field_value| 
  (where("element_values like ?", "%\"#{field_name}\":\"%#{field_value}%"))
}

just try this based on your scenario.

Upvotes: 0

apneadiving
apneadiving

Reputation: 115521

i'd do:

@deleted_history.select!{|hist| hist.changes['EXP_SUBMISSION_FK'] == '9999992642'}

One potential cause of failure is that you're looking for 9999992642 but you state before the value is '9999992642'

Upvotes: 1

Related Questions