# Array access

**URL:** <https://www.ruby-forum.com/t/array-access/110444>\
**Category:** Ruby\
**Created:** [July 26, 2007, 11:59am UTC](https://www.ruby-forum.com/t/array-access/110444 "2007-07-26T11:59:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![kabish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/a88e57/32.png) [@kabish](https://www.ruby-forum.com/u/kabish)\
**Post date:** [July 26, 2007, 11:59am UTC](https://www.ruby-forum.com/t/array-access/110444/1 "2007-07-26T11:59:30Z")

</div>

I have an Array with two Target objects. How can I manage to take each  
value of the objects?

p("targets size: " + @targets.length.to\_s) # “targets size: 2” (OK)

p @targets # [#\<Target:0x471c2f4  
@attributes={“hit\_sequence\_desc”=\>“0”,  
# “hit\_sequence\_ID”=\>"1  
# ", “hit\_sequence\_accession”=\>“0”}\>,  
#\<Target:0x471c290  
# @attributes={“hit\_sequenc  
# e\_desc”=\>“3”, “hit\_sequence\_ID”=\>“3”,  
# “hit\_sequence\_accession”=\>“3”}\>] (OK)

p @targets[0].attribute\_names # [“hit\_sequence\_ID”,  
“hit\_sequence\_accession”,  
#“hit\_sequence\_desc”] (OK)  
p @targets[0].class # Target (OK)

Now it comes the problem:

p @targets[0].hit\_sequence\_ID # nil (???)

p @targets[0].hit\_sequence\_desc # nil (???)

p @targets[0].hit\_sequence\_accession # nil (???)

---

<div class="post-metadata">

**Author:** ![kabish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/a88e57/32.png) [@kabish](https://www.ruby-forum.com/u/kabish)\
**Post date:** [July 26, 2007, 1:07pm UTC](https://www.ruby-forum.com/t/array-access/110444/2 "2007-07-26T13:07:30Z")

</div>

2007/7/26, Alvaro P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ```
> # ", "hit_sequence_accession"=>"0"}>,
> 
> ```
> 
> Now it comes the problem:
> 
> p @targets[0].hit\_sequence\_ID # nil (???)
> 
> p @targets[0].hit\_sequence\_desc # nil (???)
> 
> p @targets[0].hit\_sequence\_accession # nil (???)

Dunno your class but you probably want to try this

p @targets[0].attributes[“hit\_sequence\_ID”]

robert

---

<div class="post-metadata">

**Author:** ![kabish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/a88e57/32.png) [@kabish](https://www.ruby-forum.com/u/kabish)\
**Post date:** [July 26, 2007, 1:22pm UTC](https://www.ruby-forum.com/t/array-access/110444/3 "2007-07-26T13:22:08Z")

</div>

Nothing special with my class:

class Target \< ActiveRecord::Base

attr\_accessor :hit\_sequence\_accession,  
:hit\_sequence\_desc,  
:hit\_sequence\_ID

def initialize(hit\_sequence\_accession,  
hit\_sequence\_desc,  
hit\_sequence\_ID)  
@hit\_sequence\_accession = hit\_sequence\_accession  
@hit\_sequence\_desc = hit\_sequence\_desc  
@hit\_sequence\_ID = hit\_sequence\_ID  
end

end

There’s no targets table in the DB. i’m trying to create a custom dto  
class with data from two tables:

@targets = Target.find\_by\_sql("SELECT hit\_sequence\_accession,  
hit\_sequence\_desc, " +  
"hit\_sequence\_ID FROM hit\_sequence " +  
"JOIN sequence\_db USING(sequence\_db\_ID) ")

But doing:

p @targets[0].attributes[“hit\_sequence\_ID”]

gets me this error messagge:

ActiveRecord::StatementInvalid in SearchController#do\_search\_targets

Mysql::Error: #42S02Table ‘srnadb\_chlamy\_dev\_rails.targets’ doesn’t  
exist: SHOW FIELDS FROM targets

---

<div class="post-metadata">

**Author:** ![kabish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/a88e57/32.png) [@kabish](https://www.ruby-forum.com/u/kabish)\
**Post date:** [July 26, 2007, 5:24pm UTC](https://www.ruby-forum.com/t/array-access/110444/4 "2007-07-26T17:24:55Z")

</div>

On 7/26/07, Alvaro P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> hit_sequence_ID)
> 
> ```
> 
> @targets = Target.find\_by\_sql("SELECT hit\_sequence\_accession,
> 
> ActiveRecord::StatementInvalid in SearchController#do\_search\_targets
> 
> Mysql::Error: #42S02Table ‘srnadb\_chlamy\_dev\_rails.targets’ doesn’t  
> exist: SHOW FIELDS FROM targets

Hmm, no doubt you would receive some good help from activerecord gurus  
on the rails list.

A couple of thoughts…

An ActiveRecord::Base object needs to have a relation (table) in the  
database because many of its methods query the database (AFAIK).

Your instance variables of Target that you set with attr\_accessor have  
nothing to do with the @attributes variable provided by  
ActiveRecord::Base. In fact, you broke the accessor methods Base  
provides when you created your instance variables, which is why you  
got nil with @targets[0].hit\_sequence\_ID. The object was returning  
the instance variable and not executing the accessor _method_.

If you don’t specifically need a homemade object to hold your queried  
data, you can just…

targets = ActiveRecord::Base.find\_by\_sql()

I have no idea of your database schema, but you could do this if you  
want a Target object…

class Target \< ActiveRecord::Base  
set\_table\_name ‘sequence\_db’  
end

targets = Target.find\_by\_sql()  
targets.first.hit\_sequence\_ID

But, that is hardly the activerecord way. You should really specify  
your Base class relations with has\_many, belongs\_to, etc.

Todd

---

<div class="post-metadata">

**Author:** ![kabish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/a88e57/32.png) [@kabish](https://www.ruby-forum.com/u/kabish)\
**Post date:** [July 27, 2007, 11:19am UTC](https://www.ruby-forum.com/t/array-access/110444/5 "2007-07-27T11:19:56Z")

</div>

Hi Todd,

thank you very much for your help. First solution doesn’t work (same  
error) but mapping the Target class to sequence\_db or hit\_sequence  
tables, which are involved in the join, works perfectly. I have to  
retrieve data not with

targets.first.hit\_sequence\_ID

but with

targets.first.attributes[‘hit\_sequence\_ID’]

Thank you again,  
Alvaro.

Todd B. wrote:

> class Target \< ActiveRecord::Base  
> set\_table\_name ‘sequence\_db’  
> end
> 
> targets = Target.find\_by\_sql()  
> targets.first.hit\_sequence\_ID
> 
> But, that is hardly the activerecord way. You should really specify  
> your Base class relations with has\_many, belongs\_to, etc.
> 
> Todd
