خطأ: PG::UndefinedColumn. الحقل المخصص لا ينشئ عمودًا

هل تضيف حقول الموضوع المخصصة عمودًا في نموذج الموضوع؟ أحصل على خطأ يقول لا، وأنا أحاول معرفة ما يجب فعله حيال ذلك.


لقد أنشأت حقل موضوع مخصصًا في بيئة التطوير، متبعًا هذا الدليل. لنسمّه fun_level. يبدو أن الحقل المخصص قد تم إنشاؤه بنجاح في بيئة التطوير، لأنه إذا قمت باتصال Ajax لجلب موضوع قمت بإنشائه بعد إضافة الحقل المخصص—مثل ajax("/t/112.json")—فيعمل: تعود بيانات الموضوع وتظهر الحقل fun_level بالقيمة التي أدخلتها.

لكن الآن أحتاج إلى إيجاد طريقة لاسترداد جميع الموضوعات برمجياً التي تحتوي على قيمة معينة للحقل المخصص (على سبيل المثال، الحصول على قائمة بجميع الموضوعات حيث fun_level = ‘super-duper-fun’).

لقد فكرت في استخدام ajax("/search") لذلك، لكنني لم أتمكن من جعله يعمل بعد.

طريقة أخرى فكرت فيها هي استخدام ريلز الكلاسيكية: إنشاء وحدة تحكم، وعندما أذهب إلى مسار معين (/fun_levels/:fun_level)، استدعي طريقة العرض التالية:

  def show 
   respond_to do |format|
      format.json { render json: Topic.where(fun_level: 'super-duper-fun') }
    end
  end

ثم، استدعي ajax("/fun_levels/super-duper-fun.json")

تعمل استراتيجية طريقة العرض/اتصال Ajax هذه إذا كنت أبحث عن موضوعات بناءً على معرف أو عنوان، إلخ. ولكن عندما أستخدم الكود أعلاه-Topic.where(fun_level: 'super-duper-fun)-فإنه يرسل خطأ في الخادم الداخلي. وتقول السجلات:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column topics.fun_level does not exist LINE 1: ... "topics" WHERE "topics"."deleted_at" IS NULL AND "topics"."...

هل توجد طريقة لاسترداد موضوعات بناءً على حقل مخصص باستخدام طريقة وحدة تحكم، كما قدمت أعلاه؟ (مثل: { render json: Topic.where(fun_level: 'super-duper-fun') })

يوجد نموذج TopicCustomField. هذا هو المطلوب. ربما يمكنك إلقاء نظرة على Topic List Previews (legacy) أو على أي إضافة أخرى تتلاعب بالمواضيع. أو ربما ابحث عن HasCustomFields في جوهر Discourse.

شكرًا لك—كنتُ أبدأ في استنتاج أن شيئًا من هذا القبيل قد يكون جارٍ. لذا ربما أحتاج إلى إجراء عملية ربط (join) مع ذلك النموذج (أضطر حقًا إلى استحضار معرفتي بـ Rails مرة أخرى). لقد جربتُ شيئًا مثل هذا:

Topic.joins(:topic_custom_field).where(fun_level: 'super-duper-fun') }

لكنني حصلت على الخطأ: ActiveRecord::ConfigurationError (Can't join 'Topic' to association named 'topic_custom_field'; perhaps you misspelled it?)

هل لديك أي أفكار حول الصيغة الصحيحة؟

لا يمكنني العثور على TopicCustomField في هذه اللحظة (لكنني أخبرتك أين تبحث! :wink)

إليك هذا:

[4] pry(main)> CategoryCustomField.last
=> #<CategoryCustomField:0x000055be74a00bd0
 id: 2,
 category_id: 8,
 name: "enable_accepted_answers",
 value: "true",
 created_at: Mon, 26 Apr 2021 15:45:07.862617000 UTC +00:00,
 updated_at: Mon, 26 Apr 2021 15:45:07.862617000 UTC +00:00>

لذا شيء مثل:

tcf=TopicCustomField.where(name: 'fun_level', value: 'super-duper-fun')

بعد ذلك يمكنك الحصول على topic_id وما شابه من tcf (إنه مصفوفة من جميع التطابقات). إذا كنت تعرف topic_id، فيمكنك استخدام TopicCustomField.find_by(<كل العناصر الثلاثة لجعله فريدًا>).

رائع. شكرًا للمعلومة. سأقوم بتجربتها.