Как посеять, но не дублировать - PullRequest
0 голосов
/ 20 февраля 2020

Привет! Я хочу заполнить свою базу данных рельсами, и у меня есть модель маркировки, которая является соединительной таблицей в модели сплетен и модели тегов.

Я хочу, чтобы у каждой сплетни был хотя бы один тег и от 1 до 3 тегов , Но у меня не будет сплетни 2 раза один и тот же тег.

gossip_array = Gossip.all
​
gossip_array.each do |gossip|
    rand(1..3).times do |index|
        l = Labeling.new(gossip: gossip, tag: Tag.all.sample)
        l.save if
    end 
end

Я думаю, что я должен поставить после того, как что-то вроде: если это еще не существует, но я не знаю, как чтобы сделать это или, может быть, существует лучшее решение.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы используете Rails 4 или новее? Если это так, проверьте #find_or_create_by. Пример (разбит на 2 строки, чтобы его было легче читать):

tag = Tag.all.sample
Labeling.find_or_create_by(gossip: gossip, tag: tag)

Сначала будет выполнен запрос на маркировку с указанными gossip и tag. Если такая маркировка существует, то ничего не происходит. Но если он не существует, то создается новый с данными gossip и tag.

Документация Rails по ActiveRecord :: Relation # find_or_create_by

0 голосов
/ 20 февраля 2020

Вы имеете в виду, как это?

gossip_array = Gossip.all

gossip_array.each do |gossip|
    rand(1..3).times do |index|
        Labeling.find_or_create_by(gossip: gossip, tag: Tag.all.sample)
    end 
end
...