has_many : خلال الفواصل عند find_or_initialize_by
-
05-07-2019 - |
سؤال
لدي نموذج، Feed، ينتمي إلى العديد من FilteredUsers.في هذه الحالة قمت بتنفيذ ذلك من خلال علاقة has_many :through.
class Feed < ActiveRecord::Base
has_many :denials, :dependent => :destroy
has_many :filtered_users, :through => :denials
أرغب في إنشاء سجل إذا لم يكن موجودًا أو العثور على الكائن إذا كان موجودًا.عندما أحاول استخدام find_or_initialize_by (أو find_or_create_by) يتم طرح استثناء يقول undefined method 'feed_id=' for <FilteredUser..
هنا هو الرمز:
feed = Feed.find(params[:id])
user = feed.filtered_users.find_or_initialize_by_user_url(params[:user_url])
if params[:status] == "block"
feed.filtered_users << user
else
feed.filtered_users.delete(user)
end
feed.save
هل هناك أي اقتراحات حول كيفية إصلاح هذا أو كيفية التغلب عليه بشكل جاف؟
شكرًا!
المحلول
أولا، لأنها علاقة has_many :through
، والتهيئة لديه أي وسيلة لمعرفة أي denial
وfiltered_user
الجديدة التي ينبغي المرتبطة. إذا كنت ترغب في استخدام find_or_initialize_by
، تحتاج لتشغيله على denial
محددة مقترن مع feed
.
وبناء filtered_user الجديدة وربطه مع إنكار محددة.
وثانيا، الاتفاق مع ErsatzRyan، والمنطق العام يبدو قليلا قبالة.
نصائح أخرى
ألن يكون من الأسهل التحقق من المعلمات[:status] أولاً ثم القيام بما عليك القيام به؟
feed = Feed.find(params[:id])
if params[:status] == 'block'
feed.filtered_users.build(:user_url => params[:user_url])
else
feed.filtered_users.find_by_user_url(params[:user_url]).delete
end
feed.save
تحذير هذا مشفر بالهواء ولم يتم اختباره