Я думаю, что это действительно проблема XY, вызванная тем, что вы используете столбец массива, где вы должны использовать таблицу соединений.
Основные причины, по которым вы не хотите использовать массив, это :
- Если пользователь удален, вам придется обновлять каждую строку в таблице заданий, а не просто удалять строки в соединительной таблице с помощью каскада или обратного вызова удаления.
- Нет ссылок целостность.
- Ужасные нечитаемые запросы. На самом деле это всего лишь незначительный шаг вперед от строки, разделенной запятыми.
- Объединения не так уж дороги. «Преждевременная оптимизация - это root всего зла».
- Нельзя использовать ассоциации ActiveRecord со столбцами массива.
Создать модель соединения с помощью rails g model following user:references job:references
. А затем настройте связи:
class Job < ApplicationRecord
has_many :followings
has_many :followers,
through: :followings,
source: :user
end
class User < ApplicationRecord
has_many :followings
has_many :followed_jobs,
source: :job,
through: :followings,
class_name: 'Job'
end
Чтобы выбрать задания, за которыми следует пользователь, просто выполните внутреннее объединение:
user.followed_jobs
Чтобы получить задания, которые не выполняются, вы выполняете внешнее объединение в следующих случаях, когда идентификатор пользователя равен нулю или не равен user_id
.
fui = Following.arel_table[:user_id]
Job.left_joins(:followings)
.where(fui.eq(nil).or(fui.not_eq(1)))
Если вы хотите отменить задание, просто удалите строку из followings
:
Following.find_by(job: job, user: user).destroy
# or
job.followings.find_by(user: user).destroy
# or
user.followings.find_by(job: job).destroy
Вы можете автоматически сделать это, когда задание или пользователь уничтожены с опцией dependent:
.