通过以下方式进行多对多:从Associations :: CollectionProxy到AssociationRelation

时间:2017-02-01 09:16:21

标签: ruby-on-rails ruby activerecord rails-activerecord ruby-on-rails-5

我通过与用户关系密切的客户关系(通过favorites.rb)有多对多,我想知道如何将CollectionProxy转换为AssociationRelation,因此我可以与所有用户的客户建立关系最爱。

或者只是简单地说,如何在AssociationRelation中获取它们 - 不必从CollectionProxy转换。

编辑:我正在寻找的只是列出所有客户的关系。我意识到我以不同的方式提出问题。 如何与所有客户建立关系? - 不是与favorite_id,user_id等的关系 - 我希望与客户及其行完全建立关系。

我可以像这样找到CollectionProxy:

user = User.last
user.favorites    # Gives me a CollectionProxy

但是如何将最喜欢的客户端作为AssociationRelation找到?

模特:

user.rb:

has_many :favorites, :dependent => :destroy
has_many :clients, through: 'favorites'

Client.rb

has_many :favorites, :dependent => :destroy
has_many :users, through: 'favorites'

Favorite.rb

belongs_to :user
belongs_to :client

2 个答案:

答案 0 :(得分:1)

您可以像ActiveRecord::Associations::CollectionProxy上通常那样操作ActiveRecord_AssociationRelation

但如果你真的想拥有后者,可以打电话,例如all

user.favorites.all.class #=> Client::ActiveRecord_AssociationRelation
  

如何与所有客户建立关系?

您已定义关联:

has_many :clients, through: 'favorites'

因此,获得关联clients的关系非常简单:

user.clients

答案 1 :(得分:0)

伟大的宝石order_as_specified可以很容易地做到这一点!

1:

@favorites_collect_the_ids_in_array = @user.favorites.pluck(:client_id) 

......然后:

2:

@ar_of_all_favorites = Client.order_as_specified(id:  @favorites_collect_the_ids_in_array).where(id: @favorites_collect_the_ids_in_array)