【问题标题】:multiple has_many / belongs_to between the same 2 models相同的 2 个模型之间有多个 has_many / belongs_to
【发布时间】:2013-11-12 20:00:05
【问题描述】:

我很好奇它是如何工作的......我在相同的两个模型之间有几个 has_many 关系。这适用于日历应用程序,因此可以邀请用户参加活动,用户可以参加活动,并且活动属于用户,以便查看谁创建了活动。

user.rb

class User < ActiveRecord::Base
  has_many :invites, dependent: :destroy
  has_many :events, through: :invites

  has_many :events

  has_many :attendances, -> { where cancel: false },
                         dependent: :destroy                     
  has_many :events, -> { where "attendances.cancel" => false },
                    through: :attendances

event.rb

class Event < ActiveRecord::Base
  has_many :invites, dependent: :destroy
  has_many :users, through: :invites

  belongs_to :user

  has_many :attendances, -> { where cancel: false },
                         dependent: :destroy              
  has_many :users, -> { where "attendances.cancel" => false },
                   through: :attendances

我也有相应的连接表,在它们各自的模型中控制,attendance.rbinvite.rb

所以...这按预期工作。用户在参加活动时有活动。我做了一些调整,并意识到这是检查列表中的最后一件事。所以,如果我将邀请移到底部,那么当我执行User.find(1).events 之类的操作时,就会检查到这一点。

有没有更好的方法来解决这个问题?我觉得这只是自找麻烦,不是吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-4


    【解决方案1】:

    当我之前这样做时,我只是将关系名称更改为更独特的名称,然后通过class_name 告诉has_many 要查看的类。您可能还必须在这些更改的关系上添加 foreign_key 参数,以便 SQL 知道要匹配哪个键。

    这是基本的想法:

    用户.rb

    class User < ActiveRecord::Base
      has_many :invites, dependent: :destroy
      has_many :invited_events, through: :invites, source: "Event"
    
      has_many :events # these are events "owned" by the user
    
      has_many :attendances, -> { where cancel: false }, dependent: :destroy
      has_many :attended_events, -> { where "attendances.cancel" => false }, through: :attendances, source: "Event"
    end
    

    事件.rb

    class Event < ActiveRecord::Base
      has_many :invites, dependent: :destroy
      has_many :invitees, through: :invites, source: "User"
    
      belongs_to :user # this is the owner of the event
    
      has_many :attendances, -> { where cancel: false }, dependent: :destroy
      has_many :attendees, -> { where "attendances.cancel" => false }, through: :attendances, source: "User"
    end
    

    【讨论】:

    • 我正在使用 rails4...它对我大喊大叫,并推荐了source:。我用source: :event 替换了class_name: 'Event',一切都很好。听起来对吗?
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多