Как создавать записи в has_many через ассоциацию в rails 3.2

У меня есть две модели (пользовательская и событийная) с несколькими ассоциациями 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

Столбцы группы событий:

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>

Дайте мне знать, как это сделать.


person loganathan    schedule 24.01.2013    source источник


Ответы (4)


Используя формат .where, вы можете передать строку вида .where("event_groups.user_like_id = ?", 17), чтобы квалифицировать объединенную таблицу тегов.

Например:

User.joins(:event_groups).where("event_groups.user_like_id = ?", 17)
person My God    schedule 24.01.2013
comment
Я не прошу шагов для извлечения записей, я хочу знать, как правильно добавлять записи. - person loganathan; 24.01.2013
comment
Мне ответили на вашу строку, но я не могу получить записи пользователей с помощью event.user_likes. Вы использовали get, и это запрос get, а не add. - person My God; 24.01.2013
comment
проблема в том, что user_like_id всегда равен нулю, поэтому невозможно получить запись по вашему запросу - person loganathan; 24.01.2013

Я не уверен, но вам может понадобиться определить 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 в документе has_many

person Baldrick    schedule 24.01.2013
comment
не повезло с inverse_of :( При добавлении записей обновляется event_id вместо event_like_id - person loganathan; 25.01.2013

Мне кажется, вы пытаетесь смоделировать два отношения «многие ко многим» (Users-Participate-In-Events и Users-Like-Events), которые представляют собой разные концепции в одном отношении. Здесь я предполагаю, что пользователь может участвовать в событии, не лайкая его, и наоборот. В этом случае оставьте модель EventGroup только для представления отношений участия и создайте другую модель EventLikes для представления лайков. Столбцы в двух таблицах будут одинаковыми, но представляют разные отношения. После этого добавление события в (события или event_likes) должно работать.

person Chris Piazza    schedule 24.01.2013

Я создаю аналогичные отношения между одними и теми же моделями (пользователь-пользователь) через модель отношений, мой код:

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

person iujlaki    schedule 25.01.2013