ActiveRecord::ReadOnlyRecord

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

On Sun, Jan 25, 2009 at 7:54 PM, Alberto R. [email protected]
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)

On Sun, Jan 25, 2009 at 8:45 PM, Sandro P.
[email protected] 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 :)

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

Ciao

Alberto

Sandro P. wrote:

On Sun, Jan 25, 2009 at 8:45 PM, Sandro P.
[email protected] 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

2009/1/26 Alberto R. [email protected]:

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?

Pietro G. wrote:

2009/1/26 Alberto R. [email protected]:

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.