用户(具有名称)可以通过集合(具有编号)拥有卡片(具有名称):
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?
它会正确输出用户拥有的卡和没有人拥有的卡,但是它会过滤掉仅由其他用户拥有的卡。我也想要这些(所有卡,仅包括当前用户的收藏信息)。
答案 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 }
}
希望有帮助!