আমার অনুমান যে আপনার মডেলগুলি দেখতে এমন:
class User < ActiveRecord::Base
has_many :reviews
end
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
end
class Shop < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
আপনি বিভিন্ন কারণে এই ক্যোয়ারীটি করতে অক্ষম।
- অ্যাক্টিভেকর্ড অতিরিক্ত তথ্য ছাড়াই যোগদানটি তৈরি করতে অক্ষম।
- পর্যালোচনা নামক কোনও টেবিল নেই
এই সমস্যাটি সমাধান করার জন্য আপনাকে Review
এবং এর মধ্যে সম্পর্ক স্পষ্টভাবে সংজ্ঞায়িত করতে হবে Shop
।
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, polymorphic: true
# For Rails < 4
belongs_to :shop, foreign_key: 'reviewable_id', conditions: "reviews.reviewable_type = 'Shop'"
# For Rails >= 4
belongs_to :shop, -> { where(reviews: {reviewable_type: 'Shop'}) }, foreign_key: 'reviewable_id'
# Ensure review.shop returns nil unless review.reviewable_type == "Shop"
def shop
return unless reviewable_type == "Shop"
super
end
end
তারপরে আপনি এই জাতীয় কোয়েরি করতে পারেন:
Review.includes(:shop).where(shops: {shop_type: 'cafe'})
লক্ষ্য করুন যে টেবিলের নামটি রয়েছে shops
এবং নেই reviewable
। ডাটাবেসে রিভিউযোগ্য বলে একটি সারণী থাকা উচিত নয়।
আমি বিশ্বাস করি এটি এর join
মধ্যে স্পষ্টভাবে সংজ্ঞা দেওয়ার চেয়ে সহজ এবং আরও নমনীয় হবে Review
এবং Shop
যেহেতু এটি আপনাকে সংশ্লিষ্ট ক্ষেত্রগুলির দ্বারা অনুসন্ধান করার পাশাপাশি উত্সাহী লোড দেওয়ার অনুমতি দেয়।
এটি প্রয়োজনীয় হওয়ার কারণটি হ'ল এক্টিভেকর্ড একা পর্যালোচনাযোগ্য ভিত্তিতে একটি জোড় তৈরি করতে পারে না, যেহেতু একাধিক টেবিলগুলি যোগটির অন্য প্রান্তকে উপস্থাপন করে, এবং এসকিউএল, যতদূর আমি জানি, সঞ্চিত মান অনুসারে আপনাকে একটি সারণীতে যোগদান করতে দেয় না একটি কলামে। অতিরিক্ত সম্পর্কটি সংজ্ঞায়িত করে belongs_to :shop
, আপনি অ্যাক্টিভেকর্ডটিকে যোগদানটি সম্পূর্ণ করার জন্য প্রয়োজনীয় তথ্য দিচ্ছেন।
@reviews = @user.reviews.joins("INNER JOIN shops ON (reviewable_type = 'Shop' AND shops.id = reviewable_id AND shops.shop_type = '" + type + "')").includes(:user, :reviewable => :photos)