Forum: Italian Ruby user group ActiveRecord::ReadOnlyRecord

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
36d0dbd01030cd1690ef105b73ef328a?d=identicon&s=25 Alberto Ruffo (arcoder)
on 2009-01-25 20:54
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
0df4a6c75caf1bd9b01d2dcbfb085ee4?d=identicon&s=25 Sandro Paganotti (Guest)
on 2009-01-25 21:45
(Received via mailing list)
On Sun, Jan 25, 2009 at 7:54 PM, Alberto Ruffo <arcoder@hotmail.it>
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)
0df4a6c75caf1bd9b01d2dcbfb085ee4?d=identicon&s=25 Sandro Paganotti (Guest)
on 2009-01-25 21:46
(Received via mailing list)
On Sun, Jan 25, 2009 at 8:45 PM, Sandro Paganotti
<sandro.paganotti@gmail.com> 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 :)
36d0dbd01030cd1690ef105b73ef328a?d=identicon&s=25 Alberto Ruffo (arcoder)
on 2009-01-26 10:41
Sandro Paganotti wrote:
> On Sun, Jan 25, 2009 at 8:45 PM, Sandro Paganotti
> <sandro.paganotti@gmail.com> 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
36d0dbd01030cd1690ef105b73ef328a?d=identicon&s=25 Alberto Ruffo (arcoder)
on 2009-01-26 10:55
Dimenticavo..
Con questo metodo non funziona nei form il campo user_ids quando faccio
gli update di un record Group.

Ciao

Alberto
8768bcdbda1adf80e4da6744268868af?d=identicon&s=25 Pietro Giorgianni (giorgian)
on 2009-01-26 11:01
(Received via mailing list)
2009/1/26 Alberto Ruffo <arcoder@hotmail.it>:
> 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?
36d0dbd01030cd1690ef105b73ef328a?d=identicon&s=25 Alberto Ruffo (arcoder)
on 2009-01-26 11:42
Pietro Giorgianni wrote:
> 2009/1/26 Alberto Ruffo <arcoder@hotmail.it>:
>> 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 <select>
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.
This topic is locked and can not be replied to.