Увеличение количества встречаемости ассоциаций в таблице соединений - PullRequest
0 голосов
/ 09 мая 2018

Новое в разработке Rails. Я создаю приложение, в котором пользователи, художники и теги связаны с художниками, примененными пользователями. Вот две модели для художников и теги:

class Artist < ApplicationRecord
  has_and_belongs_to_many :tags
end
class Tag < ApplicationRecord
  has_and_belongs_to_many :artists
end

Пользователь имеет возможность либо создать новый тег, в этом случае мы создаем запись тега в таблице тегов и запись ассоциации между вновь созданным тегом и исполнителем, для которого он был создан. Второй вариант - щелчок по существующему тегу для этого исполнителя, в этом случае я хотел бы увеличить количество в таблице сопоставлений для этого тега для этого исполнителя, но Active Record не индексирует таблицы соединений, поэтому при создании можно добавить счетчик. столбец в таблицу соединений, я не могу получить доступ и изменить этот столбец. Но я могу сделать это в SQL:

UPDATE Artists_Tags
    SET count = count + 1
    WHERE artist_id=artistid AND tag_id=tagid;

Таблица в schema.rb:

create_table "artists_tags", id: false, force: :cascade do |t|
  t.bigint "artist_id", null: false
  t.bigint "tag_id", null: false
  t.integer "count", default: 1, null: false
  t.index ["artist_id", "tag_id"], name: 
"index_artists_tags_on_artist_id_and_tag_id"
end

Но я не могу поместить этот SQL-запрос в метод контроллера для обновления счетчика. Я неправильно подхожу к этой проблеме? Буду признателен за любые советы. Примечание. Увеличение счетчика используется для отображения наиболее примененного тега для этого исполнителя.

1 Ответ

0 голосов
/ 09 мая 2018

Полагаю, проблема в том, что вы используете ассоциацию HABTM, и в этом случае у вас не будет никакой дополнительной информации об отношениях (подробнее об этом см. В http://blog.flatironschool.com/why-you-dont-need-has-and-belongs-to-many/).. Я бы изменил способ сделать это). отношение «многие ко многим», использующее has_many :through с новой моделью ArtistTag. Было бы что-то вроде:

rails g model ArtistTag artist:references tag:references tag_count:integer

И изменил бы модели на:

class Artist < ApplicationRecord
  has_many :artist_tags
  has_many :tags, through: :artist_tags
end

class Tag < ApplicationRecord
  has_many :artist_tags
  has_many :artists, through: :artist_tags
end

Таким образом, вы можете сделать что-то вроде (используя активную запись):

artist_tag = artist.artist_tags.find_by_tag_id(your_tag_id)
artist_tag.update(tag_count: artist_tag.tag_count + 1)

Лично я считаю, что это лучший подход и может решить вашу проблему. Надеюсь, это поможет и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...