मैं एचएबीटीएम संबंध, कैनकन, और ActiveRecord एक आत्म संदर्भ का उपयोग कर इस स्थिति को संभालने के तरीके पर फंस गया हूँ।आप कैनकन क्षमता कैसे लिख सकते हैं? और एचबीटीएम रिलेशनशिप के संदर्भ में दोनों कामों को सुलभ कर सकते हैं?
मैं accessible_by उपयोग करने के लिए वीडियो है कि दृश्य वीडियो और चैनल के बीच एक रिश्ता दिया जाता है का एक सेट निर्धारित करने के लिए कोशिश कर रहा हूँ, लेकिन जिसके परिणामस्वरूप SQL क्वेरी के भाग के लिए गलत तालिका नाम है। यहाँ रिश्तों हैं:
# 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.
मैं एक कैनकैन क्षमता सभी सार्वजनिक वीडियो कि डिफ़ॉल्ट चैनल की सार्वजनिक उप चैनलों में हैं खोजने की जरूरत है।
# ability.rb
can :read, Video, :permission => 'public', :channel => {:permission => 'public', :parent_channels => {:name => "Default"}}
कंसोल में, जब मैं इस बाहर की कोशिश, मैं निम्नलिखित मिल:
> 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'
=> []
मैं जगह में कुछ रिकॉर्ड है कि एक वीडियो में परिणाम चाहिए है, और, और अधिक मैं निम्नलिखित की कोशिश की बिंदु पर, "parent_channels_channels"। "name" = 'default' होने के बाद क्वेरी के अंत की उम्मीद होगी, लेकिन तालिका "चैनल" स्थिर है, जिसके परिणामस्वरूप SQL डेटा संदर्भित होने के बाद गलत डेटासेट है चैनल का नाम, माता-पिता चैनल नहीं।
मैं क्षमता को बदलने के रूप में तालिका नाम के लिए मजबूर करने की कोशिश की इस प्रकार है:
can :read, Video, :permission => 'public', :channel => {:permission => 'public', :parent_channels => {"parent_channels_channels.name" => "Default"}}
यह सही क्वेरी में परिणाम है, और accessible_by रिटर्न सही डाटासेट है, लेकिन फिर कर सकते हैं (: पढ़ें, वीडियो) उस परिणाम में एक वीडियो के लिए सेट रनटाइम त्रुटि में परिणाम।
NoMethodError: undefined method `parent_channels_channels.name' for #<Channel:0x007fef35593748>
मैं कैसे तो यह दोनों कर सकते हैं के साथ काम करता इस क्षमता निर्दिष्ट करूँ? और सुलभ_by?