# ActiveRecord::ReadOnlyRecord

**URL:** <https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612>\
**Category:** IT\
**Created:** [January 25, 2009, 8:54pm UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612 "2009-01-25T20:54:09Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 25, 2009, 8:54pm UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/1 "2009-01-25T20:54:09Z")

</div>

Ciao a tutti,  
sto utilizzando 3 tabelle con relazione has\_and\_belongs\_to\_many.

Quindi, ho una cosa del genere:

(users)  
id | nome | nick…

(groups)  
id | nome | descrizione…

(users\_groups)  
user\_id | group\_id | ruolo

Nella mia action ho scritto:

```
  @group = Group.find(params[:id])
  to_assign = params[:users]
  if to_assign
    to_assign.each do |user_id,role|
      unless role.blank?
       ub = @group.users.find(:first,:conditions => ["id = ? and

```

group\_id = ?",user\_id, @group.id])  
ub.ruolo = role  
ub.save  
end  
end  
end

I dati del form arrivano tutti correttamente, ma users\_groups.ruolo non  
me lo aggiorna perchÃ¨ va in errore:  
ActiveRecord::ReadOnlyRecord in AccountController#putroles  
ActiveRecord::ReadOnlyRecord

Vi ringrazio

Alberto

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 25, 2009, 9:45pm UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/2 "2009-01-25T21:45:49Z")

</div>

On Sun, Jan 25, 2009 at 7:54 PM, Alberto R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> (users\_groups)  
> user\_id | group\_id | ruolo

Dovresti usare has\_many :through perche l’has\_and\_belongs\_to\_many  
‘nasconde’ la tabella  
di join al framework. (cioè la tabella users\_groups).

IMHO dovresti cambiare le cose cosi:

class User  
has\_many :users\_groups  
has\_many :groups, :throught=\>:users\_groups  
end

class Group  
has\_many :users\_groups  
has\_many :users, :throught=\>:users\_groups  
end

class UsersGroup  
belongs\_to :user  
belongs\_to :group  
end

> Nella mia action ho scritto:
> 
> ```
> @group = Group.find(params[:id])
> to_assign = params[:users]
> if to_assign
> to_assign.each do |user_id,role|
> unless role.blank?
> 
> ```

```
        ub = @group.users(user_id)
        ub.users_groups.find_by_group_id(@group.id).update_attribute(:role,role)

```

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 25, 2009, 9:46pm UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/3 "2009-01-25T21:46:25Z")

</div>

On Sun, Jan 25, 2009 at 8:45 PM, Sandro P.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > id | nome | descrizione…
> 
> class UsersGroup
> 
> > ```
> > to_assign = params[:users]
> > if to_assign
> > to_assign.each do |user_id,role|
> > unless role.blank?
> > 
> > ```
> 
> ```
> ub = @group.users(user_id)
> 
> ```

```
         (ho dimenticato un find qui sopra :)

```

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 26, 2009, 10:55am UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/4 "2009-01-26T10:55:19Z")

</div>

Dimenticavo…  
Con questo metodo non funziona nei form il campo user\_ids quando faccio  
gli update di un record Group.

Ciao

Alberto

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 26, 2009, 10:41am UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/5 "2009-01-26T10:41:23Z")

</div>

Sandro P. wrote:

> On Sun, Jan 25, 2009 at 8:45 PM, Sandro P.  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > > id | nome | descrizione…
> > 
> > class UsersGroup
> > 
> > > ```
> > > to_assign = params[:users]
> > > if to_assign
> > > to_assign.each do |user_id,role|
> > > unless role.blank?
> > > 
> > > ```
> > 
> > ```
> > ub = @group.users(user_id)
> > 
> > ```
> 
> ```
> (ho dimenticato un find qui sopra :)
> 
> ```

Ciao, grazie per la risposta.  
Ho un problemino.

ub = @group.users(user\_id)  
ub.users\_groups.find\_by\_group\_id(@group.id).update\_attribute(:role,role)

In questo modo mi va in errore, dicendomi:  
undefined method `users\_groups’ for class…

Da quel che ho capito ‘users\_groups’ lo trova come figlio di USER e non  
di USERS, cosÃ¬ ho cambiato il codice dell’update cosÃ¬:  
@group.users\_bands.find(:first, :conditions =\> [“user\_id =  
?”,user\_id]).update\_attribute(:ruolo,role)

perÃ² mi dÃ quest’errore:  
Mysql::Error: Unknown column ‘id’ in ‘where clause’: UPDATE  
`users_bands` SET `user_id` = 33, `group_id` = 2, `ruolo` = ‘dd’ WHERE  
`id` = NULL

Inserisco la colonna ID? Ma poi come faccio con le altre 2 colonne  
user\_id group\_id ??

Grazie ancora

Saluti

Alberto

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 26, 2009, 11:01am UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/6 "2009-01-26T11:01:42Z")

</div>

2009/1/26 Alberto R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> però mi dà quest’errore:  
> Mysql::Error: Unknown column ‘id’ in ‘where clause’: UPDATE  
> `users_bands` SET `user_id` = 33, `group_id` = 2, `ruolo` = ‘dd’ WHERE  
> `id` = NULL
> 
> Inserisco la colonna ID? Ma poi come faccio con le altre 2 colonne  
> user\_id group\_id ??

se hai optato per has\_many :through, sì, ci vuole il campo id.

in che senso, come fai con le altre due colonne?

---

<div class="post-metadata">

**Author:** ![arcoder](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arcoder](https://www.ruby-forum.com/u/arcoder)\
**Post date:** [January 26, 2009, 11:42am UTC](https://www.ruby-forum.com/t/activerecord-readonlyrecord/158612/7 "2009-01-26T11:42:53Z")

</div>

Pietro G. wrote:

> 2009/1/26 Alberto R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > perï¿½ mi dï¿½ quest’errore:  
> > Mysql::Error: Unknown column ‘id’ in ‘where clause’: UPDATE  
> > `users_bands` SET `user_id` = 33, `group_id` = 2, `ruolo` = ‘dd’ WHERE  
> > `id` = NULL
> > 
> > Inserisco la colonna ID? Ma poi come faccio con le altre 2 colonne  
> > user\_id group\_id ??
> 
> se hai optato per has\_many :through, sï¿½, ci vuole il campo id.
> 
> in che senso, come fai con le altre due colonne?

Ok, allora lo aggiungo e tolgo la primary a group\_id.

Riguarda il parametro [user\_ids] ?  
Questo mi serve per aggiungere degli utenti al gruppo con una   
multipla che mi restituisce un array di user ID.  
Il bello di questo parametro Ã¨ che Rails capisce di cosa si tratta e  
aggiunge tutto(compresi gli ID nella tabella users\_bands) con un save,  
senza fare modifiche nell’azione.  
Ma non lo riconosce con la nuova relazione tra tabelle.
