create_join_tableでuuidを使う場合はどう書けばいいのか。

column_options: { type: :uuid }を使う。

class CreateJoinTableUserWork < ActiveRecord::Migration[5.1]
  def change
    create_join_table :users, :works, column_options: { type: :uuid } do |t|
      t.index [:user_id, :work_id]
      t.index [:work_id, :user_id]
    end
  end
end

現場からは以上です。

HABTMのupdateは面倒だ。

でも http://wiki.rubyonrails.com/rails/pages/CheckboxHABTM ここに詳しく載ってた。(と思ったらリンク先無くなってますね)

<% Group.find(:all).each do |g| %>
<%= check_box_tag "user[group_ids][]",
  g.id, @user.groups.include?(g)) %> <%= g.name %>
<% end %>

こんな感じで書いて、controllerのupdateに

@user.groups.clear if !params['user']['group_ids']

こう書いておけばチェック外したらちゃんと消える。

中間テーブルにidがあると変なidが勝手に入るし、Duplicate Entryになる。create時にidがつかないようにしとく。

create_table(:groups_users, :id => false) do |t|
 ・・・
end

昔ハマったはずなのにまたハマった。鳥頭・・・。

ヘルパー

普段どうやってるかというと、こういうヘルパーを使っています。

def habtm_check_box(object, method, target_method, options = {})
  id = object.class.name.underscore
  items = method.to_s.camelize.constantize
  items.all.map do |item|
    label_tag("#{id}_#{method}_#{item.id}",
      check_box_tag("#{id}[#{method}_ids][]",
        item.id,
        object.send(method.to_s.pluralize).include?(item),
        :id => "#{id}_#{method}_#{item.id}")+' '+h(item.send(target_method)),
    :class => 'checkbox')+"\n" 
  end.join
end

でgrave(お墓)が複数のcharacter(特徴)を持つ場合、

<%= habtm_check_box @grave, :character, :name %>

みたいな感じで使います。