Возможно присоединение к Rails Action Text Model

Используя Rails 6 rc1, я делаю запрос к модели под названием "Работа".

Модель работы (job.rb):

has_rich_text :description
belongs_to :company, dependent: :destroy, required: false

def self.search(query)  
  joins(:company, :description)
  .where.not(has_ended: true)
  .where("jobs.title ILIKE ?", query)
  .where("jobs.description ILIKE ?", query)
  .where("companies.name ~* ?", "^#{query}") # https://www.postgresql.org/docs/8.3/functions-matching.html
end

Это именно то, что у меня есть. Пока что моя проблема с включением has_rich_text, Ошибка при репликации в консоль рельсов Job.joins(:description):

ActiveRecord:: AssociationNotFoundError (Ассоциация с именем 'description' не найдена в Job; возможно, вы ее неправильно написали?

При поиске "hight and low" я не смог найти никакой документации по этому уровню запросов. Я не пробовал scope упоминается здесь

1 ответ

Фактически уже существует отношение has_one, определенное методом has_rich_text

https://github.com/rails/rails/blob/f2b69d80ab9e81d2b3cc526aa5ad87e432b66081/actiontext/lib/action_text/attribute.rb

# name on the next two lines is a reference to what you called your rich_text.
has_one :"rich_text_#{name}",
  -> { where(name: name) },
  class_name: "ActionText::RichText",
  as: :record,
  inverse_of: :record,
  autosave: true,
  dependent: :destroy

Итак, в вашем случае вы хотите присоединиться к rich_text_description


Для поиска по нескольким rich_texts вы можете добавить отношение has_many rich_texts.

has_many :rich_texts,
  class_name: "ActionText::RichText",
  as: :record,
  inverse_of: :record,
  autosave: true,
  dependent: :destroy

Оказывается, вы можете! Я разместил этот метод на странице Rails Github, которую я использовал, но мне нужно знать, есть ли лучший способ.

Я использовал внутреннее соединение

отношение модели - 1:1, а статья: action_text_rich_text

в модели статьи

scope :search, -> (name) { joins("INNER JOIN action_text_rich_texts ON action_text_rich_texts.record_id = articles.id").where("action_text_rich_texts.body LIKE ? or articles.title like ?", "%#{name}%", "%#{name}%") }
Другие вопросы по тегам