Задать вопрос
No_Time
@No_Time

Rails HABTM relationship. Как правильно сохранять?

Всем привет!



Имеются 2 модели:



class Hashtag < ActiveRecord::Base<br>
	    has_and_belongs_to_many :photos<br>
        attr_accessible :name<br>
       ***<br>
end<br><br>
class Photo < ActiveRecord::Base<br>
       has_and_belongs_to_many :hashtags, :uniq => true<br>
       ***<br>
end<br>




Join таблица:



def up<br>
  create_table :hashtags_photos, :id => false do |t|<br>
         t.integer :photo_id<br>
         t.integer :hashtag_id<br>
  end<br><br>
  add_index :hashtags_photos, [:photo_id, :hashtag_id], :unique => true<br>
end<br>




При создании Photo в before_safe передается следующий метод:



def set_hashtags<br>
      text.scan(/#[[:alnum:]]+/).each do |workpiece|<br>
            next if workpiece.length > 25<br>
            hashtag = Hashtag.find_by_name(workpiece)<br>
            if hashtag<br>
              hashtag.touch<br>
            else<br>
              hashtag = Hashtag.new(:name => workpiece).save!<br>
            end<br>
            hashtags << hashtag<br>
      end <br>
    end<br>




Где text — поле у Photo, которое всегда не nil. Все бы здорово, но не работает. Сыпет вот такими ошибками:



ActiveRecord::AssociationTypeMismatch: Hashtag(#70309985182100) expected, got TrueClass(#70309973845700)<br>




Пробовал юзать методы first_or_initialize и first_or_create!, все безрезультатно. Видимо я просто не понимаю как рельсы работают с has_and_belongs_to_many.



В чем косяк?
  • Вопрос задан
  • 4572 просмотра
Подписаться 2 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@Mox
Team Lead, RoR, React/React Native
Я обычно явно объявляю модель для связи ( HashtagPhoto в данном примере)

И делаю has_many и has_many :through; ( а не habtm)

Добавляю в модель attr_accessor который выдает мне связанные данные в нужном виде
( например attr_accessor :hashtags_ids ( список id или еще что нужно в контексте))

и before_save уже создаю линки в таблице связей.

Немного дубово, зато надежно
Ответ написан
@Cepega
hashtag = Hashtag.new(:name => workpiece).save!
В этой строчке, по моему, переменная hashtag, получает значение true, если Hashtag создается, или false, если произошла ошибка создания.

Замени на

hashtag = Hashtag.new(:name => workpiece)
hashtag.save!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы