所以我有一个用户可以创建汽车的应用程序。他们也喜欢汽车,我想在两者之间建立联系。他们创造的汽车属于他们,他们喜欢的汽车属于喜欢它们的环境。为此,我建立了如下关联:
用户协会:
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(用户喜欢的汽车)?
答案 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