মডেলগুলি সমান নয় যেখানে সন্ধান করে


127

আমি কীভাবে আমার ডাটাবেসে একটি সমান শর্তে রেকর্ড পেতে পারি? আমার এখন এটি আছে তবে এটি করার কোনও অভিনব রেল-স্পিক উপায় আছে?

GroupUser.where('user_id != ?',me)

আপনার কাছে যা আছে তা হ'ল এটি খুব ভাল ails
স্পাইরোস

উত্তর:


229

4. কারাগারে (দেখুন http://edgeguides.rubyonrails.org/active_record_querying.html#not- শর্তাদি )

GroupUser.where.not(user_id: me)

কারাগারে 3.x

GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))

দৈর্ঘ্য সংক্ষিপ্ত করার জন্য, আপনি GroupUser.arel_tableকোনও পরিবর্তনশীলতে সঞ্চয় করতে পারেন বা যদি GroupUserনিজেই মডেলটির ভিতরে ব্যবহার করেন তবে উদাহরণস্বরূপ, এর পরিবর্তে scopeআপনি ব্যবহার করতে পারেনarel_table[:user_id]GroupUser.arel_table[:user_id]

@ জেবার্ডেনের উত্তরে রেল 4.0 সিনট্যাক্স ক্রেডিট


মেলামেশা সম্পর্কে কি? - has_many: group_users, -> {where.not (স্ট্যাটাস: "অস্বীকার করা হয়েছে") through, এর মাধ্যমে: গ্রুপ, বিদেশী_কি: "ব্যবহারকারী_আইডি"
আজব্রাস

4
পার্শ্ব নোট হিসাবে, এটি ভালভাবে GroupUser.where(other_condition: true).where.not(user_id: user_id)
বেঁধে দেওয়া


26

আপনি এটি ফ্যানসিয়ার পাওয়ার একমাত্র উপায় মেটাওয়ের সাথে রয়েছে

মেটাওয়ের একটি নতুন চাচাত ভাই রয়েছে যার নাম স্কুইয়েল যা এই জাতীয় কোডের অনুমতি দেয়:

GroupUser.where{user_id != me}

এটি বলার অপেক্ষা রাখে না যে, আপনি যদি এটি তৈরি করতে চলেছেন তবে কেবল এটিই একটি রত্ন ব্যবহার করার মতো নয় এবং আমি যা পেয়েছি তা দিয়েই আমি আটকে থাকব। আপনার কাছে রুবি কোডের সাথে ইন্টারঅ্যাক্ট করার অনেক জটিল প্রশ্ন রয়েছে যেখানে স্কুয়েল দরকারী।


4
মেটাওয়েথ দুর্দান্ত, তবে রত্ন যোগ না করে এই কাজটি করা যেতে পারে।
tybro0103

1
@ tybro0103 অবশ্যই কাজটি করা যেতে পারে (এবং ওপি যেভাবে এটি করছে তা পুরোপুরি ঠিক আছে), প্রশ্নটি এটি ফ্যানসিয়ার করার বিষয়ে is সুতরাং আপনি যদি ভাবেন যে এটি কোনও রত্ন ছাড়াই ফ্যানসিয়ার করা যায় তবে আমি কীভাবে এটি করতে আগ্রহী।
জাকুব হাম্পল

বিক্রান্তের উত্তরটি এমন কোনও সমাধান সরবরাহ করে যা স্কুএল বা অন্য কোনও রত্নকে অন্তর্ভুক্ত করে না। তবে, আমি সংশোধন করেছি, আপনার উত্তর অবশ্যই সবচেয়ে কোডার-বান্ধব / অভিনব।
tybro0103

1
এমন একটি সাধারণ কাজ সম্পাদনের জন্য একটি রত্ন যোগ করা।
বাজুকার

এটি ওভারকিল
আদালত

23

রেল 4:

আপনি যদি সমান এবং সমান উভয়ই ব্যবহার করতে চান তবে আপনি ব্যবহার করতে পারেন:

user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)

আপনি যদি বিভিন্ন অপারেটর (যেমন। >, <) ব্যবহার করতে চান তবে কিছু সময় আপনি নীচে স্বরলিপিগুলি স্যুইচ করতে চাইতে পারেন:

GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)

কি হবে GroupUser.where(group_id: group_id).where.not(user_id: user_id)?
এনরিকো কারলেসো

পোস্ট পোস্টের জন্য ধন্যবাদ। আপনার পরামর্শ অন্তর্ভুক্ত করার জন্য আমি আমার উত্তর আপডেট করেছি। ধন্যবাদ।
রিক স্মিথ

9

সমিতিগুলির সাথে ডিল করার সময় আপনার সর্বদা এসকিউএল কোয়েরিতে সারণির নাম অন্তর্ভুক্ত করা উচিত ।

প্রকৃতপক্ষে যদি অন্য কোনও টেবিলের user_idকলাম থাকে এবং আপনি উভয় টেবিলগুলিতে যোগদান করেন তবে আপনার এসকিউএল ক্যোয়ারিতে একটি দ্ব্যর্থক কলামের নাম থাকবে (অর্থাত্ ঝামেলা)।

সুতরাং, আপনার উদাহরণে:

GroupUser.where("groups_users.user_id != ?", me)

বা কিছুটা আরও ভার্বোজ:

GroupUser.where("#{table_name}.user_id IS NOT ?", me)

মনে রাখবেন যে আপনি যদি একটি হ্যাশ ব্যবহার করছেন তবে আপনার এটি নিয়ে চিন্তা করার দরকার নেই কারণ রেলগুলি এটি আপনার জন্য যত্ন নেয়:

GroupUser.where(user: me)

4 ডিলগুলিতে, @ dr4k3 দ্বারা যেমন বলা হয়েছে, ক্যোয়ারী পদ্ধতিটি যুক্ত notকরা হয়েছে:

GroupUser.where.not(user: me)

6

3 রেলগুলিতে, আমি কোনও অনুরাগী জানি না। তবে, আমি নিশ্চিত না আপনি সচেতন কিনা, আপনার সমান শর্তটি (ইউজার_আইডি) নুল মানগুলির সাথে মেলে না। আপনি যদি এটি চান তবে আপনাকে এই জাতীয় কিছু করতে হবে:

GroupUser.where("user_id != ? OR user_id IS NULL", me)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.