ruby-on-rails Ruby on Rails ActiveRecord -具有别名表上的自定义联接的has_many

yrdbyhpb  于 2023-08-08  发布在  Ruby
关注(0)|答案(1)|浏览(106)

上下文:

  • 我有三个模型:UserProjectUserMessage
  • Messages通过item_iditem_type具有多态连接,可以属于UserProjectUser
  • Users有多个ProjectUsers
    目标:在ProjectUser模型中,我想定义一个名为general_messageshas_many关系,以获取与ProjectUserProjectUser.user相关的所有Messages。连接看起来像这样:
ProjectUser.joins(:user).joins('JOIN messages AS general_messages ON general_messages.item_id IN (project_users.id, users.id)')

字符串

注意:我希望能够使用常规ActiveRecord方法连接和过滤。即ProjectUser.joins(:general_messages).where(general_messages: { ...WHERE CLAUSE }),因此通过定义has_many关系来实现这一点非常重要

q5lcpyga

q5lcpyga1#

好吧,这些都是根据你的需要量身定制的,但有不同的事情要做。
使用普通的ActiveRecord,我会使用lambda作为作用域参数,以定义关系将做什么。
下面这行还没有测试过,但是你可以用它来玩一下,看看你能得到什么。
来源:https://api.rubyonrails.org/v7.0.6/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

has_many :general_messages, ->(project_user) {
    where(type: 'User', id: project_user.user_id).
    or(type: 'ProjectUser', id: project_user.id)
}, class_name: "Message"

字符串

相关问题