i have project allows users have conversations other users. conversations can contain multiple users via userconversations
modal. userconversations
need polymorphic can belong chatrooms
. however, when add polymorphic association relationships break.
class user < applicationrecord has_many :user_conversations, dependent: :destroy has_many :conversations, through: :user_conversations end class userconversation < applicationrecord belongs_to :user belongs_to :parent, polymorphic: true has_many :conversations, through: :user_conversations end class conversation < applicationrecord has_many :messages, as: :context, dependent: :destroy has_many :user_conversations, as: :parent, dependent: :destroy has_many :users, through: :user_conversations end class chatroom < applicationrecord belongs_to :venue has_many :messages, as: :context, dependent: :destroy has_many :user_conversations, as: :parent, dependent: :destroy has_many :users, through: :user_conversations end 2.3.1 :009 > user = user.first user load (1.8ms) select "users".* "users" order "users"."id" asc limit $1 [["limit", 1]] => #<user id: 1, name: "loi tran", email: "loi@coderschool.vn", password_digest: "$2a$10$edz6iytazvk4qnvjfihpp.3fheihdv0bwuvqrtjjk86...", image_url: "https://scontent.fsgn5-2.fna.fbcdn.net/v/t1.0-1/p3...", created_at: "2017-08-21 07:20:11", updated_at: "2017-08-29 18:47:04", city: "tallahassee", state: "florida", position: "getting yelled at", school: "florida state university", quote: "if easy, it.", avatar: nil, last_name: "tran", first_name: "loi"> 2.3.1 :010 > user.user_conversations userconversation load (0.8ms) select "user_conversations".* "user_conversations" "user_conversations"."user_id" = $1 limit $2 [["user_id", 1], ["limit", 11]] => #<activerecord::associations::collectionproxy [#<userconversation id: 453, user_id: 1, created_at: "2017-09-10 06:01:27", updated_at: "2017-09-10 06:01:27", parent_type: "chatroom", parent_id: 8>, #<userconversation id: 454, user_id: 1, created_at: "2017-09-10 06:02:22", updated_at: "2017-09-10 06:02:22", parent_type: "conversation", parent_id: 318>]> 2.3.1 :011 > user.conversations nomethoderror: undefined method `klass' nil:nilclass did mean? class (irb):11
i'm using rails 5.1.3
& ruby 2.3.1
i need user.conversations work. please help!
use 2 join models instead, both simpler , avoid major cons of polymorphism:
- no foreign key support db not know table association points to.
- joins tricky since have query table know table join. bad join table.
since join tables consist of 2 columns , model has little logic using polymorphism not give headaches.
class user < applicationrecord has_many :user_conversations, dependent: :destroy has_many :conversations, through: :user_conversations has_many :chatroom_users, dependent: :destroy has_many :chatrooms, through: :chatroom_users end class userconversation < applicationrecord belongs_to :user belongs_to :conversation end class conversation < applicationrecord has_many :messages, as: :context, dependent: :destroy has_many :user_conversations, dependent: :destroy has_many :users, through: :user_conversations end class chatroomuser < applicationrecord belongs_to :user belongs_to :chatroom end class chatroom < applicationrecord belongs_to :venue has_many :messages, as: :context, dependent: :destroy has_many :chatroom_users, dependent: :destroy has_many :users, through: :user_chatrooms end
Comments
Post a Comment