Rails JSON过滤器关联结果

时间:2018-08-12 05:26:48

标签: ruby-on-rails json

用户(具有名称)可以通过集合(具有编号)拥有卡片(具有名称):

class User < ActiveRecord::Base
    has_many :collections
    has_many :cards, through: :collections
end
class Card < ActiveRecord::Base
    has_many :collections
    has_many :users, through: :collections
end
class Collection < ActiveRecord::Base
    belongs_to :user
    belongs_to :card
end

我的卡片API包含所有卡片和托收信息:

class CardsController < ApplicationController
    def index
        @cards = Card.all
        render json: @cards, :include => :collections
    end
end

我想删除不属于用户queryparam的集合。我尝试过:

@cards = @cards.includes(:collections).where(collections: { user_id: [nil, params[:user]] }) if params[:user].present?

它会正确输出用户拥有的卡和没有人拥有的卡,但是它会过滤掉仅由其他用户拥有的卡。我也想要这些(所有卡,仅包括当前用户的收藏信息)。

1 个答案:

答案 0 :(得分:0)

在您的CardsController中尝试一下:

@cards = Card.includes(:collections).filtered_cards(current_user.id).sort_by { |t| t.created_at }.reverse!

然后在您的Card模型中创建一个范围,该范围过滤掉用户的卡片,并且集合不归任何人所有:

scope :filtered_cards, -> (user_id) {
  select { |card| card.collections.each { |col| col.user_id == user_id }.length > 0 || card.user_id == nil }
}

scope :filtered_cards, -> (user_id) {
  select { |card| card.collections.map(&:user_id).include?(user_id) || card.user_id = nil }
}

希望有帮助!