2014-10-09 3 views
0

У вас есть has_manybelongs_to отношения И a has_many :through отношения без каких-либо вызовов вызова метода?Rails несколько типов ассоциаций

Например, что будет user.hacks return - хаки, которые опубликовал пользователь, или хаки, которые пользователь отметил как избранное?

Мне нужно уметь получить доступ к обеим результатам.

class User < ActiveRecord::Base 
    has_many :hacks, through: :favorites 

    has_many :hacks 
end 

class Hack < ActiveRecord::Base 
    has_many :hacks, through: :favorites 

    belongs_to :users 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :hack 
end 
+1

что на самом деле вы пытаетесь сделать? Ассоциации has_many: через которые вы определили неверно. Вы можете уточнить свое требование? – vikram

+0

@vikram Что вы хотите знать? Что вы подразумеваете под тем, что я на самом деле пытаюсь сделать? Это так же, как в OP. Я не понимаю, чего не хватает. Все есть. Пожалуйста, дополните. – ahnbizcad

ответ

4

has_many определяет методы в зависимости от имени отношения.

Это означает, что если вы определяете отношения несколько раз с тем же именем, но с разными параметрами, последнее определение переопределяет методы предыдущих вызовов определения.

Значит, вы не можете определить их с тем же именем.

Если вам необходимо получить доступ к обоим, хаки и любимых хаки, вы должны создать отношения следующим образом

class User < ActiveRecord::Base 
    has_many :hacks 
    has_many :favorites 
    has_many :favorited_hacks, through: :favorites, source: :hack 
end 
+0

Итак, как мне добиться возможности получить хаки в обоих направлениях? (т. е. все хаки, принадлежащие пользователю, и все взломы, которые пользователь предпочитает?) – ahnbizcad

+0

Я только что обновил ответ :) – Fer

0

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

has_many :favorite_hacks, through: :favorites, class: :hacks 

Там, кажется, опечатка в Hack.

На другой ноте, как вы это делаете, мне кажется странным. Отношение пользователя к взлому похоже на собственность, а пользовательский fav похож на закладок.

+0

Да, ваш последний абзац верен. Что тогда должно быть по-другому? – ahnbizcad

+0

Я хочу, чтобы получить все закладочные хаки. Я также хочу получить все взломы, принадлежащие пользователю. – ahnbizcad

0

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

class User < ActiveRecord::Base 
    has_many :hacks 
end 

class Hack < ActiveRecord::Base 
    belongs_to :user 

    scope :favorite, -> { where(favorite: true) } 
end 

и просто иметь атрибут на вашем Hack модели favorite. Затем вы можете найти фаворитов, вызвав user.hacks.favorite.

+0

как бы вы могли бы отличить, был ли взломан какой-либо другой пользователь, если любимым является атрибут в таблице взлома? Фавориты должны быть отдельной таблицей соединений. – ahnbizcad

+0

Если мы возьмем, что избранные - это отдельная таблица, то эта версия будет включать область .join'. Не стесняйтесь обновлять ответ как таковой. Я думаю, люди найдут это полезным. – ahnbizcad

+0

Мой ответ действителен только в предположении, что хаки (и любимые хаки) входят в сферу действия пользователя. – nicohvi

Смежные вопросы