【问题标题】:How to create records in has_many through association in rails 3.2如何通过rails 3.2中的关联在has_many中创建记录
【发布时间】:2013-01-08 08:51:54
【问题描述】:

我有两个模型(用户和事件),通过关联具有多个 has_many,我当前的关联是通过以下逻辑:

  1. 用户可以通过 EventGroup 参与很多活动
  2. 事件通过 EventGroup 有很多用户
  3. 用户可以通过 Eventgroup 点赞很多活动
  4. 活动通过 Eventgroup 获得了很多用户的喜欢

型号:

class User
 has_many :event_groups
 has_many :events,:through => :event_groups
 has_many :event_likes,:through => :event_groups,:class_name => "Event"
end

class Event
  has_many :event_groups
  has_many :users,:through => :event_groups
  has_many :user_likes,:through => :event_groups,:class_name => "User"
end

class EventGroup
  belongs_to :user
  belongs_to :event
  belongs_to :user_like,:class_name => "User"
  belongs_to :event_like,:class_name => "Event"
end

EventGroup 列:

user_id
event_id
user_like_id
event_like_id

建立关联后,我尝试使用以下代码创建关联记录:

user = User.first
user.event_likes << Event.first  
user.save

这里的记录是用 user_id & event_like_id 而不是 `user_like_id & event_like_id

但我无法通过 event.user_likes 获取用户记录,因此我检查了我的事件组记录。它有nil value for user_like_id.

#<EventGroup id: 24, event_id: 1, user_id: 2,event_like_id: 1, user_like_id: nil>

让我知道正确的做法。

【问题讨论】:

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


    【解决方案1】:

    使用 .where 格式,您可以传递类似 .where("event_groups.user_like_id = ?", 17) 的字符串来限定连接的标记表。

    例如:

    User.joins(:event_groups).where("event_groups.user_like_id = ?", 17)
    

    【讨论】:

    • 我不是在问检索记录的步骤,我想知道正确添加记录的方法。
    • 我收到了您的回复“但我无法通过 event.user_likes 获取用户记录”。您使用了get,这是get 查询,但不是add
    • 问题是 user_like_id 始终为零,因此无法通过您的查询检索记录
    【解决方案2】:

    我不确定,但您可能需要在 has_many 关系中定义 inverse_of

    class User
     #...
     has_many :event_likes, :through => :event_groups, :inverse_of => :user_likes, :class_name => "Event"
    end
    
    class Event
      #...
      has_many :user_likes, :through => :event_groups, :inverse_of => :event_likes, :class_name => "User"
    end
    

    :through in the doc of has_many章节

    【讨论】:

    • inverse_of 不走运 :( 添加记录时 event_id 被更新而不是 event_like_id
    【解决方案3】:

    在我看来,您正在尝试对两种多对多关系(用户参与事件和用户喜欢事件)建模,它们是一种关系中的不同概念。我在这里假设用户可以在不喜欢的情况下参与事件,反之亦然。在这种情况下,保持EventGroup 模型仅表示参与关系,并创建另一个EventLikes 模型来表示喜欢。两个表中的列相同,但代表不同的关系。之后,将事件添加到(事件或 event_likes)应该可以工作

    【讨论】:

      【解决方案4】:

      我通过关系模型在相同模型(用户-用户)之间创建相似的关系, 我的代码:

      has_many :relationships, foreign_key: "follower_id", dependent: :destroy

      has_many :followed_users, through: :relationships, source: :followed

      has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy

      has_many :followers, through: :reverse_relationships, source: :follower

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2011-12-04
        • 2020-11-20
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        相关资源
        最近更新 更多