首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同模型Rails 4的多态关联

同模型Rails 4的多态关联
EN

Stack Overflow用户
提问于 2015-04-02 23:01:08
回答 3查看 454关注 0票数 1

因此,我有一个应用程序,用户可以创造汽车。他们也可以喜欢汽车,我想在两者之间建立联系。他们创造的汽车是属于他们的,而他们喜欢的汽车则是通过喜欢他们的环境而属于他们的。为此,我设立了以下协会:

用户协会:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :cars
  has_many :cars, -> {distinct}, through: :likes
end

汽车协会:

代码语言:javascript
复制
class Car < ActiveRecord::Base
  belongs_to :users
  has_many :likes
  has_many :users, -> { distinct }, through: :likes
 end

类似协会:

代码语言:javascript
复制
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 (对于用户喜欢的汽车)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-03 00:12:01

因此,奥列格的以下回答并不完全奏效,但却引导我朝着正确的方向前进。谢谢!我首先遵循上面的示例并执行以下操作:

代码语言:javascript
复制
    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,:通过=>:=>,:source =>‘。是使用者之一还是汽车使用者?

所以我把它改成:

代码语言:javascript
复制
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

现在这两种模式都适用了!谢谢,希望这对其他有同样问题的人有帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-04-02 23:22:22

has_many :cars, -> {distinct}, through: :likes重写has_many :cars,因为它重新定义了User.cars。尝试以下几点:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-04-03 05:31:47

我看不出您在哪里将任何模型定义为多态模型。

过去我做过这样的事.实际上,我这样做是为了标记/taggings,并将用户应用于另一个实例的标记“类似”。这是一个临时修改,我可能遗漏了一些东西,但这是多态关联的一个非常常见的用例。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29423896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档