Rails 上具有相同模型 Ruby 的多态关联 4

Polymorphic Association with same model 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 汽车之前。我以前可以调用@user.cars,它会显示用户的汽车。现在它 return 是用户喜欢的汽车的集合。我需要每个集合的方法。

当我尝试时:User.likes.cars

我得到一个

No Method error

并且控制台日志查看了点赞记录,但仍然没有 return 汽车,即使我的点赞记录有一个 car_id 字段。

我看了一堆问题,但无法理解它们。我还尝试在模型中定义方法,但似乎没有任何效果。感谢任何帮助。

我如何才能更改我的关联,以便我可以同时查询 User.cars(对于用户创建的汽车)和 User.likes.cars(对于用户喜欢的汽车)?

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

如果问题仍然存在,请告诉我。可能还有其他错误。

所以 Oleg 的以下回答并不完全有效,但引导我朝着正确的方向前进。谢谢!我开始按照上面的例子做:

    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

它现在适用于两种型号!谢谢,希望这对遇到同样问题的其他人有所帮助。

我没看到您在哪里将任何模型定义为多态的。

过去我做过这样的事情..实际上我是为 tags/taggings 做的,并使 "like" 成为用户应用于另一个实例的标签。这是一个临时修改,我可能遗漏了一些东西,但它是多态关联的一个非常常见的用例。

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