Я пытаюсь смоделировать систему User
s и Message
s. Message
имеют addresser
и addressee
. User
есть sent_message
и received_messages
.
Прямо сейчас тесты терпят неудачу, так как не могут найти addressee_id и addresser_id. Я хотел бы знать, правильно ли я смоделировал это и как мне создавать сообщения через пользователей.
Изменить: вывод из тестов
ActiveRecord::UnknownAttributeError:неизвестный атрибут: addressee_id
Появляется в операторе before в спецификации сообщения.
Модель пользователя
class User < ActiveRecord::Base
has_many :sent_messages, class_name: "Message", foreign_key: "addresser_id"
has_many :received_messages, class_name: "Message", foreign_key: "addressee_id"
Модель сообщения
class Message < ActiveRecord::Base
validates :addresser_id, presence: true
validates :addressee_id, presence: true
belongs_to :addresser, class_name: "User", foreign_key: "addresser_id"
belongs_to :addressee, class_name: "User", foreign_key: "addressee_id"
end
Миграция
class CreateMessages < ActiveRecord::Migration
def change
create_table :messages do |t|
t.string :content
t.integer :addresser_id
t.integer :addressee_id
t.timestamps
end
add_index :messages, [:addressee_id, :addresser_id, :created_at]
end
end
схема
create_table "messages", force: true do |t|
t.string "content"
t.integer "addresser"
t.integer "addressee"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "messages", ["addressee", "addresser", "created_at"], name: "index_messages_on_addressee_and_addresser_and_created_at"
message_spec
require 'spec_helper'
describe Message do
let(:user1) { FactoryGirl.create(:user) }
let(:user2) { FactoryGirl.create(:user) }
before { @message = user1.sent_messages.build(content: "Lorem ipsum", addressee_id: user2.id) }
subject { @message }
it { should respond_to(:content) }
it { should respond_to(:addresser_id) }
it { should respond_to(:addressee_id) }
its(:addresser) { should eq user1 }
it { should be_valid }
describe "when addresser is not present" do
before { @message.addresser = nil }
it { should_not be_valid }
end
describe "when addressee is not present" do
before { @message.addressee = nil }
it { should_not be_valid }
end
end