واحد-كثير-كثير assoc تجد الظروف
-
05-07-2019 - |
سؤال
لقد حصلت على النماذج التالية:
المشروع.rb
has_many :tasks
المهمة.rb
belongs_to :project
has_many :assignments
has_many :users, :through => :assignments
المستخدم.rb
has_many :assignments
has_many :tasks, :through => :assignments
الاحالة.rb
belongs_to :task
belongs_to :user
لذلك على سبيل المثال: المشروع.أولا.عنوان #=> "مانهاتن" المشروع.أولا.المهام.خريطة(&:اسم) # => ['تجد العلماء', 'العثور على المال', 'العثور على موقع'] المشروع.أولا.المهام.أولا.المستخدمين.خريطة(&:full_name) #=> ['جيمس ماكسويل', 'Evariste جالويس', 'جول فيرن']
سؤالي الأول هو: كيف يمكنني العثور على جميع الأشخاص أسماء ربما مع رمز بروك في طلقة واحدة ، حاولت:
Project.first.tasks.users.full_name #=> AND FAILED
Project.first.tasks.map(&:users).full_name #=> AND FAILED
Project.first.tasks.map(&:users).map(&:full_name) #=> AND FAILED
أي أفكار ؟
و أعتقد أن هذا السؤال التالي قد يكون في نفس الكرة الحديقة:
كيف يمكنني أن أفعل تجد من المشروع مع ظروف البحث في 'full_name' السمة المستخدمين لها المهام ؟
على سبيل المثال
Project.all(:include => {:tasks => :users}, :conditions => ['tasks.users.full_name LIKE ?', query]) #this failed
أعتقد أن المشكلة هي في 'المهام.المستخدمين.
شكرا للجميع, سعيد عيد الشكر!
المحلول
أول واحد سوف تريد أن تفعل شيئا مثل هذا:
Project.first.tasks.map { |t| t.users.map(&:full_name) }.flatten
والسبب في ذلك هو أن كنت ترغب في تكرار خلال كافة المهام ثم جميع المستخدمين في كل مهمة.دون تسطيح هذا من شأنه أن يعطي لك مجموعة 2 الأبعاد.
وعلى الثاني واحدة تجد ينبغي أن يكون:
Project.all(:include => {:tasks => :users}, :conditions => ['users.full_name LIKE ?', query])
الكتابة users.full_name
يعني مشغل SQL التي كنت تبحث عن full_name
الميدانية على users
الجدول.