因此,我有一个应用程序,用户可以创造汽车。他们也可以喜欢汽车,我想在两者之间建立联系。他们创造的汽车是属于他们的,而他们喜欢的汽车则是通过喜欢他们的环境而属于他们的。为此,我设立了以下协会:
用户协会:
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 (对于用户喜欢的汽车)?
发布于 2015-04-03 00:12:01
因此,奥列格的以下回答并不完全奏效,但却引导我朝着正确的方向前进。谢谢!我首先遵循上面的示例并执行以下操作:
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 =>‘。是使用者之一还是汽车使用者?
所以我把它改成:
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现在这两种模式都适用了!谢谢,希望这对其他有同样问题的人有帮助。
发布于 2015-04-02 23:22:22
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如果问题仍然存在,请告诉我。可能还有另一个错误。
发布于 2015-04-03 05:31:47
我看不出您在哪里将任何模型定义为多态模型。
过去我做过这样的事.实际上,我这样做是为了标记/taggings,并将用户应用于另一个实例的标记“类似”。这是一个临时修改,我可能遗漏了一些东西,但这是多态关联的一个非常常见的用例。
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
endhttps://stackoverflow.com/questions/29423896
复制相似问题