Adicionar dados em uma tabela com relacionamento NxN

Olá pessoal,

Sou novo em RoR. Estava fazendo alguns exercícios quando me deparei com um relacionamento NxN, como vocês podem ver aqui:

Model Restaurante

[code]class Restaurante < ActiveRecord::Base

has_many :qualificacoes
has_and_belongs_to_many :pratos

validates_presence_of :nome, :message => "Deve ser preenchido"
validates_presence_of :endereco, :message => "Deve ser preenchido"
validates_presence_of :especialidade, :message => “Deve ser preenchido”

validates_uniqueness_of :nome, :message => "Nome já cadastrado"
validates_uniqueness_of :endereco, :message => “Endereço já cadastrado”

validate :primeira_letra_deve_ser_maiuscula

private
def primeira_letra_deve_ser_maiuscula
errors.add(“nome”, “A primeira letra deve ser maiúscula”) unless nome =~ /[A-Z].*/
end
end[/code]

Model prato

[code]class Prato < ActiveRecord::Base

has_and_belongs_to_many :restaurantes
has_one :receita

validates_presence_of :nome, :message => "- deve ser preenchido"
validates_uniqueness_of :nome, :message => “- nome já cadastrado”

validate :validate_presence_of_more_than_one_restaurante
private
def validate_presence_of_more_than_one_restaurante
errors.add(“restaurantes”, “deve haver ao menos um restaurante”) if restaurantes.empty?
end

end[/code]

Migration do relacionamento

[code]class CreatePratosRestaurantesJoinTable < ActiveRecord::Migration
def self.up
create_table :pratos_restaurantes, :id => false do |t|
t.integer :prato_id
t.integer :restaurante_id
end
end

def self.down
drop_table :pratos_restaurantes
end
end[/code]

Acho que não cometi erros até aqui, certo? O problema é quando vou criar um objeto do tipo prato e tentar salva-lo: Graças à validação no Model Prato a indicação do estaurante é obrigatório, mas quando tento adicionar ao objeto prato§ o restaurante (p.restaurantes = 1, por exemplo), tenho como retorno o seguinte erro no terminal:

[quote]NoMethodError: undefined method each' for 1:Fixnum from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:320:inreplace’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations.rb:1325:in `restaurantes='
from (irb):15[/quote]

Gostaria que vocês me respondessem, por favor, como faço pra criar um objeto prato e salva-lo no banco de dados, assim como fazer com que a tabela pratos_restaurantes seja atualizado automaticamente.

Abraço!

pelo erro, parece que tu ta tentando fazer algo tipo

prato.restaurantes = 1

O código nem chegou na validação ainda, então não é com a tua validação o problema …

posta ai o código que tu ta usando para tentar salvar o prato e o restaurante …

Outra coisa, eu sempre acho que não é boa idéia utilizar o has_and_belongs_to_many, por exemplo:
se um prato é servido em mais de um restaurante, ele pode ser bom em um restaurante e não ser em outro, ou ter preços diferentes, neste caso tu pode quere salvar estas diferenças. Se isto for verdade, o que quase sempre é, seria melhor criar uma entidade intermediaria que representa esta associação prato/restaurante, e fazer a associação do prato e do restaurante com esta entidade intermediaria, e não direto um com o outro. Segue exemplo (escrito direto no browser, então pode não funcionar de cara):

class Prato &lt; ActiveRecord::Base
  has_many :prato_restaurantes
  has_many :restaurantes, :through =&gt; :prato_restaurantes
end
class Restaurante &lt; ActiveRecord::Base
  has_many :prato_restaurantes
  has_many :pratos, :through =&gt; :prato_restaurantes
end
class PratoRestaurante &lt; ActiveRecord::Base
  belongs_to :prato
  belongs_to :restaurante
end

Bom, esta é só uma idéia, mas como eu disse, o problema não esta na tua validação, pelo erro, parece que esta onde tu ta tentando adicionar um restaurante a um prato.