我有一个User类。每个用户都有许多社交帐户,但每种类型之一(Instagram,Facebook等...)。每个社交帐户都有帖子,每个帖子都有互动(喜欢,评论等......)
交互的“用户”(例如,评论者/ liker)由评论者的用户名(Interaction.first.username #-> 'myInstagramUserName'
)定义,交互的“类型”(无论是类似于Instagram还是类似Facebook)是由相关帖子的相关社交帐户类型(Interaction.first.post.social_account.type #-> 'InstagramAccount'
)定义。
现在,由于并非所有的喜欢者或评论者都必须在我的用户表中 - 只有那些使用我的服务的人,我想关联那些来自交互的人。
用户类:
class User < ActiveRecord::Base
has_many :social_accounts
has_many :posts, through: :social_accounts
has_many :interactions, through: :posts
SocialAccount类:
class SocialAccount < ActiveRecord::Base
belongs_to :user
has_many :posts, dependent: :destroy
has_many :interactions, through: :posts
发布课程:
class Post < ActiveRecord::Base
belongs_to :social_account
has_many :interactions, dependent: :destroy
has_one :user, through: :social_account
互动课程:
class Interaction < ActiveRecord::Base
belongs_to :post
has_one :target_social_account, through: :post, source: :social_account
has_one :target_user, through: :post, source: :user
我的问题
每个交互应该有两个与之关联的用户 - from_user(谁喜欢'或'评论')和target_user。
后者我设法定义via:interaction - &gt;发布 - &gt; social_account - &gt;用户。
然而,第一个关联更复杂:
我需要在社交帐户中找到user_id,其用户名与交互的用户名相同,其类型与交互帖子的social_account类型相同。
通过使用SocialAccount中的验证,只允许一对唯一的,因此应该只有一个匹配:
validates :type, uniqueness: {scope: :social_account_id}
当然,如果用户在social_accounts中不存在,则应返回nil。
更新
好吧,我通过在互动中添加以下功能取得了一些进展:
has_one :from_social_account, -> (me) { where('social_accounts.type = ?', me.target_social_account.type)}, primary_key: :social_user_id, foreign_key: :social_user_id, class_name: 'SocialAccount'
和
def from_user
from_social_account ? from_social_account.user : nil
end
这允许我现在通过以下方式获得与交互相关联的用户(那个是喜欢的人 - 而不是'喜欢'的人): Interactions.first.from_user
我仍然想知道是否有更好的方法可以完全跳过from_user
。