1

У меня есть приложение, в котором пользователи могут создавать автомобили. Они также могут нравиться автомобилям, и я хочу создать связь между ними. Автомобили, которые они создали, принадлежат им и Автомобили, которые им нравятся, принадлежат им в контексте их симпатии. Для этого я создал свои ассоциации следующим образом:Полиморфная ассоциация с той же моделью Ruby on Rails 4

Ассоциация пользователей:

class User < ActiveRecord::Base 
    has_many :cars 
    has_many :cars, -> {distinct}, through: :likes 
end 

Ассоциация автомобилей:

class Car < ActiveRecord::Base 
    belongs_to :users 
    has_many :likes 
    has_many :users, -> { distinct }, through: :likes 
end 

Как Ассоциация:

class Like < ActiveRecord::Base 
belongs_to :user 
belongs_to :car 
end 

Проблема заключается в том, что до того, как у меня был мой пользователь has_many cars, через объявленные отношения. Раньше я мог называть @ user.cars, и он представлял бы автомобили пользователя. Теперь он возвращает коллекцию автомобилей, которые понравился пользователю. Мне нужны методы для каждой коллекции.

Когда я пытаюсь: User.likes.cars

Я получаю

No Method error

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

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

Как я могу изменить свои ассоциации, чтобы у меня был запрос для пользователя User.cars (для автомобилей, созданных пользователем) и User.likes.cars (для автомобилей, которые понравились пользователю)?

ответ

2

Итак, нижний ответ от Олега не работал точно, а привел меня в правильном направлении. Спасибо! Я начал следующий пример выше и делает:

class User < ActiveRecord::Base 
     has_many :cars 
     has_many :car_likes, -> {distinct}, class_name: 'Car', through: :likes 
    end 

    class Car < ActiveRecord::Base 
     belongs_to :users 
     has_many :likes 
     has_many :user_likes, -> { distinct }, class_name: 'User', through: :likes 
     end 

Это возвратил следующую ошибку в консоли:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) "car_likes" or :car_like in model Like. Try 'has_many :car_likes, :through => :likes, :source => '. Is it one of user or car?

Так что я изменил его:

class User < ActiveRecord::Base 
    has_many :cars 
    has_many :car_likes, -> {distinct}, through: :likes, source: :cars 
end 
Car Association: 

class Car < ActiveRecord::Base 
    belongs_to :users 
    has_many :likes 
    has_many :user_likes, -> { distinct }, through: :likes, source: :users 
end 

Он актуалисты работает как моделей! Спасибо, и, надеюсь, это полезно для кого-то другого с той же проблемой.

0

has_many :cars, -> {distinct}, through: :likes переопределяет has_many :cars, потому что он переопределяет User.cars. Попробуйте следующее:

class User < ActiveRecord::Base 
    has_many :cars 
    has_many :car_likes, -> {distinct}, class_name: 'Car', through: :likes 
end 
Car Association: 

class Car < ActiveRecord::Base 
    belongs_to :users 
    has_many :likes 
    has_many :user_likes, -> { distinct }, class_name: 'User', through: :likes 
end 

#To get them, instead of user.likes.cars 
@user.car_likes 
@car.user_likes 

Пожалуйста, дайте мне знать, если проблема не исчезнет. Возможно, возникнет другая ошибка.

0

Я не вижу, где вы определяете любую модель как полиморфную.

В прошлом я сделал что-то вроде этого. Фактически я сделал это для тегов/тегов и сделал «как» тег, который пользователь применил к другому экземпляру. Это специальная модификация, и я, возможно, что-то пропустил, но это довольно распространенный вариант использования полиморфных ассоциаций.

class Like < ActiveRecord::Base 
    belongs_to :likeable, polymorphic: true 
    ... 
end 

class Liking < ActiveRecord::Base 
    belongs_to :like 
    belongs_to :likeable, :polymorphic => true 
end 

class User < ActiveRecord::Base 
    has_many :likings, :as => :likeable 
    has_many :likes, -> { order(created_at: :desc) }, :through => :taggings 
end 
Смежные вопросы