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

时间:2015-04-02 23:01:09

标签: ruby-on-rails ruby associations rails-activerecord polymorphic-associations

所以我有一个用户可以创建汽车的应用程序。他们也喜欢汽车,我想在两者之间建立联系。他们创造的汽车属于他们,他们喜欢的汽车属于喜欢它们的环境。为此,我建立了如下关联:

用户协会:

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,它会呈现用户的汽车。现在它返回用户喜欢的汽车的集合。我需要每个集合的方法。

当我尝试:User.likes.cars

我得到了

  

无方法错误

并且控制台日志会查看喜欢的记录,即使我喜欢的记录有car_id字段,它仍然不会返回汽车。

我看了很多问题但却无法理解它们。我也试图在模型中定义方法,似乎没有任何东西可行。任何帮助表示赞赏。

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

3 个答案:

答案 0 :(得分: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:无法在模型中找到源关联“car_likes”或:car_like。试试'has_many:car_likes,:through =&gt; :likes,:source =&gt; ”。是用户还是汽车?

所以我把它改成了:

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

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

答案 1 :(得分: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

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

答案 2 :(得分: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