(Возможно, я мог бы придумать лучшее название для этого и открыть для себя предложения)

Я пытаюсь вызвать это в своем NotesController, тестируя его в консоли rails:

    ?> u = User.first
  User Load (1.6ms)  SELECT "users".* FROM "users" LIMIT 1
=> #<User id: 2, email: nil, password: nil, linkedin_url: nil, created_at: "2012-06-17 05:54:44", updated_at: "2012-06-17 05:54:44", liid: "7fB-pQGIQi">
>> c = u.contacts.first
  Contact Load (2.0ms)  SELECT "contacts".* FROM "contacts" WHERE "contacts"."user_id" = 2 LIMIT 1
=> #<Contact id: 8, user_id: 2, created_at: "2012-06-19 01:23:45", updated_at: "2012-06-19 01:23:45">
>> c.notes.create!(:body => "this is a note")
   (0.5ms)  BEGIN
  SQL (23.3ms)  INSERT INTO "notes" ("body", "contact_id", "created_at", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["body", "this is a note"], ["contact_id", 8], ["created_at", Thu, 21 Jun 2012 05:42:21 UTC +00:00], ["updated_at", Thu, 21 Jun 2012 05:42:21 UTC +00:00], ["user_id", nil]]
   (1.7ms)  COMMIT
=> #<Note id: 4, created_at: "2012-06-21 05:42:21", updated_at: "2012-06-21 05:42:21", body: "this is a note", user_id: nil, contact_id: 8>

Проблема в последней строке, где говорится, что созданная заметка имеет user_id: nil. Мне интересно, что мне не хватает, что не позволяет примечанию правильно получить user_id из контакта user_id? Я могу придумать быстрое исправление, чтобы установить user_id в объекте заметки, но кажется, что он может получить его из contact_id, я ошибаюсь?

Вот мои модели на случай, если это будет полезно:

class Contact < ActiveRecord::Base
  attr_accessible :user_id

  belongs_to :user
  has_many :notes
end

class User < ActiveRecord::Base
  attr_accessible :password, :liid

  has_many :contacts
  has_many :notes, :through => :contacts
end

class Note < ActiveRecord::Base
  attr_accessible :title, :body

  belongs_to :contact
  belongs_to :user
end

Спасибо за помощь!

0
botbot 21 Июн 2012 в 09:29

1 ответ

Лучший ответ

Ваша заметка также должна принадлежать вашему пользователю:

class Note < ActiveRecord::Base
  attr_accessible :title, :body

  belongs_to :contact
  belongs_to :user
end

Rails будет автоматически устанавливать только foreign_key родительского объекта, но не родительский объект родительского объекта, как вы хотите. Поэтому вам придется установить этот атрибут вручную:

c.notes.create!(:body => "this is a note", :user_id => c.user_id)
1
lee 21 Июн 2012 в 10:16
Хммм, user_id по-прежнему равен нулю. Вы были правы, я не добавил own_to: user в заметку
 – 
botbot
21 Июн 2012 в 09:34
Обновлен исходный пост, чтобы отразить новую сессию и модель консоли rails
 – 
botbot
21 Июн 2012 в 09:43
Как вы уже догадались, вам придется вручную установить user_id на объекте Note. (обновленный код, чтобы отразить это)
 – 
lee
21 Июн 2012 в 10:18
Ладно, похоже, это будет единственный раз, когда я хотел, чтобы рельсы были еще более «волшебными», чем были.
 – 
botbot
21 Июн 2012 в 10:20