Problema con *_ids en relacion has_many con :through

Tengo una relación n:m entre ‘members’ (miembros) y ‘awards’ (premios).
Así
tengo las relaciones hechas en los modelos:

Member.rb;
has_many :awards_members, :class_name => “AwardsMembers”
has_many :awards, :through => :awards_members

Award.rb:
has_many :awards_members, :class_name => “AwardsMembers”
has_many :members, :through => :awards_members

Awards_members.rb
belongs_to :member
belongs_to :award

Tengo un formulario para crear y actualizar a miembros, en él necesito
poner
check_box’s para marcar los premios. Así que hago uso del helper de esta
manera:

<%= check_box_tag “member[award_ids][]”, award.id,
@member.awards.include?(award)
%>

Pero este es el error que recibo: undefined method `award_ids=’ for
#Member:0x30ce718

Al parecer la relación “has_many :awards, :through => :awards_members”,
no
me crea los métodos que debería crearme. Por si sirve de algo la
relación
"has_many :awards_members, :class_name => “AwardsMembers” si que me crea
el
correspondiente “awards_member_ids”,

¿alguien sabe como solucionar el problema?

Saludos.

On 9/8/07, Iñigo Sola Núñez [email protected] wrote:

Awards_members.rb
Pero este es el error que recibo: undefined method `award_ids=’ for


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Las asociaciones has_many :through de Rails no generan ni el método
collection_singular_ids ni collection_singular_ids=. Una de las
posibles razones es que en ese tipo de asociaciones hay datos
adicionales en el modelo intermedio y esos datos se podrían perder
utilizando _ids e _ids=.

En tu caso no se si sería más sencillo utilizar una
asociaciónhas_and_belongs_to_many, pero si no quieres utilizarla puedes crear
_ids e _ids= en tus modelos:

def awards_ids
self.awards.map(&:id)
end

def awards_ids=(new_ids)
ids = (new_ids || []).reject(&:blank?)
old_ids = self.awards_ids

self.transaction do
AwardsMembers.destroy_all({ :award_id => old_ids - new_ids,
:member_id => self.id })
(new_ids - old_ids).each do |award_id|
self.awards_members.create!(:award_id => award_id)
end
end
end

No se si es a prueba de balas y quizá podría ser más inteligente y
eficiente, pero creo que te puede servir para lo que quieres.

Suerte.