如何通过rails 3.2中的关联在has_many中创建记录

时间:2013-01-24 14:48:30

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

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

  1. 用户可以通过EventGroup参与许多活动
  2. Event通过EventGroup有很多用户
  3. 用户可以通过Eventgroup
  4. 了解很多活动
  5. 通过Eventgroup
  6. ,活动有很多用户喜欢

    型号:

    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
    

    enter image description here 此处记录是使用user_id&amp;创建的。 event_like_id而不是`user_like_id&amp; 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>
    

    让我知道正确的方法。

4 个答案:

答案 0 :(得分:0)

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

例如:

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

答案 1 :(得分:0)

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

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

一章

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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