Sono impantanato su come gestire questa situazione utilizzando una relazione HABTM autoreferenziale, cancan e ActiveRecord.Come puoi scrivere un'abilità di cancan così? e accessibile_di entrambi funzionano sulla relazione HABTM autoreferenziale?
Sto tentando di utilizzare accessibile da per determinare un set di video visibili in base a una relazione tra video e canali, ma l'SQL risultante ha il nome di tabella errato per parte della query. Qui ci sono le relazioni:
# video.rb
class Video < ActiveRecord::Base
belongs_to :channel
end
# channel.rb
class Channel < ActiveRecord::Base
has_many :videos
has_and_belongs_to_many :subchannels, :class_name => "Channel", :join_table => "channels_channels", :foreign_key => :parent_id, :association_foreign_key => :subchannel_id
has_and_belongs_to_many :parent_channels, :class_name => "Channel", :join_table => "channels_channels", :foreign_key => :subchannel_id, :association_foreign_key => :parent_id
end
# The appropriate channels_channels table exists with subchannel_id and parent_id fields.
Ho bisogno di un capacità cancan per trovare tutti i video pubblici che sono pubblici sotto-canali del canale predefinito. Ho provato quanto segue:
# ability.rb
can :read, Video, :permission => 'public', :channel => {:permission => 'public', :parent_channels => {:name => "Default"}}
Nella console, quando provo questo fuori, ottengo il seguente:
> Video.accessible_by(Ability.new(nil))
SELECT "videos".* FROM "videos" INNER JOIN "channels" ON "channels"."id" = "videos"."channel_id" INNER JOIN "channels_channels" ON "channels_channels"."subchannel_id" = "channels"."id" INNER JOIN "channels" "parent_channels_channels" ON "parent_channels_channels"."id" = "channels_channels"."parent_id" WHERE "videos"."permission" = 'public' AND "channels"."permission" = 'public' AND "channels"."name" = 'Default'
=> []
Ho alcuni record nel posto che dovrebbe tradursi in un video, e, più in al punto, ci si sarebbe aspettati che la fine della query avesse "parent_channels_channels". "name" = 'Default', ma la tabella è "canali" invece, con conseguente dataset errato poiché l'SQL fa riferimento il nome del canale, non il canale genitore.
Ho provato a cambiare la capacità nel modo seguente per forzare il nome della tabella:
can :read, Video, :permission => 'public', :channel => {:permission => 'public', :parent_channels => {"parent_channels_channels.name" => "Default"}}
che si traduce nella query corretta, e accessible_by restituisce il set di dati a destra, ma poi lattina? (: Leggere, il video) per un video in tale set di risultati genera un errore di runtime.
NoMethodError: undefined method `parent_channels_channels.name' for #<Channel:0x007fef35593748>
Come faccio a specificare questa capacità in modo che funziona sia con lattina? e accessibile da?