আপনি কি একটি রেল 3 অনুসন্ধানের তারিখের তুলনায় তুলনায় আরও বেশি কিছু করতে পারেন?


125

আমার কাছে এই অনুসন্ধানগুলি 3 রেলগুলিতে রয়েছে:

Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p[:date]).order('date ASC, created_at ASC')

তবে আমার :date => p[:date]শর্তটি সামঞ্জস্যপূর্ণ হওয়া দরকার :date > p[:date]। কিভাবে আমি এটি করতে পারব? পড়ার জন্য ধন্যবাদ.

উত্তর:


226
Note.
  where(:user_id => current_user.id, :notetype => p[:note_type]).
  where("date > ?", p[:date]).
  order('date ASC, created_at ASC')

অথবা আপনি সমস্ত কিছু এসকিউএল স্বরলিপিতে রূপান্তর করতে পারেন

Note.
  where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
  order('date ASC, created_at ASC')

2
এটা কি নিরাপদ? মানে যদি পি [: তারিখ] ব্যবহারকারীর ইনপুট থেকে আসে তবে এটি কি এসকিউএল ইঞ্জেকশন সৃষ্টি করতে পারে?
এমএইচডি সাইরওয়ান

7
এটি নিরাপদ কারণ where()where()স্বয়ংক্রিয়ভাবে ব্যবহার করা ইনপুট থেকে পালিয়ে যায়।
সাইমন কার্লেটি

34
সিমনের মন্তব্য সম্পূর্ণ সত্য নয়; where()ভেরিয়েবলের জায়গায় প্রশ্ন-চিহ্ন সহ উপরে প্রদর্শিত ফর্ম্যাটে এটি ফাংশন কলের পরে তালিকাভুক্ত হয়ে ইনপুটটি স্বয়ংক্রিয়ভাবে পালিয়ে যায়। এটি এইভাবে ব্যবহার করা নিরাপদ নয়:Note.where("date > #{p[:date]}")
বিডিএক্স

4
লক্ষ্য করার মতো বিষয়, আপনি যে মডেলগুলির উভয়কেই ক্ষেত্রের সাথে একত্রীকরণ করেন সে ক্ষেত্রে ব্যবহার where("user_id = ?",current_user.id)করা ঝুঁকিপূর্ণ । কাঁচা এসকিউএল স্বরলিপি মানে কি টেবিল ব্যাখ্যা নিজেকে যেমন অন্তর্ভুক্ত করতে হবে ব্যবহার হচ্ছে: । where(user_id: current_user.id)user_idwhere("notes.user_id = ?",current_user.id)
ড্রেডপাইরেটশান

1
আপনার এই বিষয়ে সতর্ক হওয়া উচিত, কারণ সময় অঞ্চল। "" রেলগুলি যেখানে সরাসরি "" ডাটাবেসে যায় এবং ডাটাবেসে ডেটাটি ইউটিসি-তে সংরক্ষিত হয় আপনি যখন ব্যবহার করেন তবে উদাহরণস্বরূপ আপনার ইউটিসি +5 থাকা উচিত এবং এটি সঠিক হবে না। সুতরাং এটি করার আগে পি [তারিখ] আপনার বর্তমান ইউটিসিতে রূপান্তর করতে নিশ্চিত করুন
পাওলো তারুদ

70

কলামের নামগুলি অস্পষ্ট যেখানে আপনি যদি সমস্যাগুলি হিট করেন তবে আপনি এটি করতে পারেন:

date_field = Note.arel_table[:date]
Note.where(user_id: current_user.id, notetype: p[:note_type]).
     where(date_field.gt(p[:date])).
     order(date_field.asc(), Note.arel_table[:created_at].asc())

2
কোনও কারণে, পোস্টগ্র্রেএসকিউএল সার্ভারে সিমোনটির "কোথায়" পদ্ধতি ব্যবহার করে কলামটি পাওয়া যায়নি বলে আমি একটি ত্রুটি পেয়েছিলাম তবে এটি এসকিউএলাইটে কাজ করে। আপনার পদ্ধতি উভয় উপর কাজ করে।
প্লেকমাচার

2

আপনি ব্যবহার করার চেষ্টা করতে পারেন:

where(date: p[:date]..Float::INFINITY)

সমতুল্য বর্গ

WHERE (`date` >= p[:date])

ফলাফল হলো:

Note.where(user_id: current_user.id, notetype: p[:note_type], date: p[:date]..Float::INFINITY).order(:fecha, :created_at)

এবং আমিও বদলেছি

order('date ASC, created_at ASC')

জন্য

order(:fecha, :created_at)

0

রেল .1.১where শর্তাদি তুলনামূলক অপারেটরদের জন্য একটি নতুন 'সিনট্যাক্স' যুক্ত করেছে , উদাহরণস্বরূপ:

Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)

সুতরাং আপনার ক্যোয়ারী নিম্নরূপে আবার লেখা যেতে পারে:

Note
  .where(user_id: current_user.id, notetype: p[:note_type], 'date >', p[:date])
  .order(date: :asc, created_at: :asc)

এখানে PR এর একটি লিঙ্ক যেখানে আপনি আরও উদাহরণগুলি পেতে পারেন find

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.