没有id的rails关联,基于复杂的密钥

时间:2015-11-15 06:42:10

标签: ruby-on-rails associations

我有一个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

0 个答案:

没有答案