class Message < ActiveRecord::Base
belongs_to :conversation
belongs_to :user
end
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :conversations
has_many :conversations, class_name: "Conversation", foreign_key: :user2_id
end
class Conversation < ActiveRecord::Base
belongs_to :user
belongs_to :user2, class_name: "User", foreign_key: :user2_id
has_many :messages
end
spec:
require 'rails_helper'
RSpec.describe Message, type: :model do
it "should be available to 2 users" do
u = User.create(email: 'x@y.com', password: '8888888888')
u2 = User.create(email: 'z@w.com', password: '8888888888')
c = Conversation.create(user_id: u.id, user2_id: u2.id)
expect(u2.conversations.count).to eq 1
expect(u.conversations.count).to eq 1
end
end
这一行:
expect(u.conversations.count).to eq 1
失败。
大概是因为我的第二个has_many
但如果删除它,则expect(u2.conversations.count).to eq 1
会失败。
是的,我明确地希望对话中只有2个用户。我试图避免做HABTM。
我如何使这项工作?
答案 0 :(得分:1)
has_many :conversations
has_many :conversations, class_name: "Conversation", foreign_key: :user2_id
您只能拥有1个has_many的设置名称。当ruby类加载时,你的第一个has_many被第二个覆盖。我无法想出一个更好的名字,但你应该将其中一个命名为不同的,也许是为了证明发起对话的人。
答案 1 :(得分:1)
你可以使用has_many:through和连接模型。以下是如何进行设置的说明:http://www.tweetegy.com/2011/02/setting-join-table-attribute-has_many-through-association-in-rails-activerecord/。