2引用相同的模型而没有has_and_belongs_to_many

时间:2015-04-04 02:40:03

标签: ruby-on-rails ruby activerecord model-associations

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。

我如何使这项工作?

2 个答案:

答案 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/