Array True

November 22, 2016

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

Так вот, в рейлс many-to-many в принципе принято делать через доп-таблицу. Но если вы отважный хакер, без стыда и совести, то можно сделать так:

create_table "products" do |t|
  t.integer  "owner_ids",    default: [], array: true
end

В модели:

def owners
  @owners ||= User.where(id: owner_ids).to_a
end

Во вьюхе формы:

= bootstrap_form_for(@user) do |f|
  = f.select :owner_ids, User.all, {}, {class: "select2", multiple: true}

Честно скажу, я не вижу ничего особо криминального так делать даже в серьезном продакшене (если джойны не нужны и таблицы маленькие). Но у меня уже большая деформация, так как рейлс-фич уже давно не писал, а разобраться могу, если жизнь заставит, практически в любом коде. В вопросах стиля себе уже не доверяю. Но написать такой many-to-many в режиме хакантона имхо проще классического (у нас давно работает в одной утилитке). Прокатит это или нет - 50 на 50.

comments powered by Disqus