平衡点


2006/08/06

_ n:n リレーションシップ

中間テーブルも弄りたい, とか思い始めたよ. habtm(has_and_belongs_to_many) でも行けるのかもしれないけど, has_many() + has_many(:through => ) で.

例として

  • Paper には複数の Authors がいる(場合もある)
    • Authors には順番が存在している
  • Author は複数の Papers を持っている(…場合もある)

こんな時. 中間テーブルとして Priorities(名前が変だが) を作成してみる. Priorities は

def self.up
  create_table(:priorities) do |t|
    t.column(:author_id, :integer)
    t.column(:paper_id, :integer)
    t.column(:priority, :integer)
  end
end

def self.down
  drop_table(:priorities)
end

みたいに作ってやる(migrate).

でもって model で

# app/models/paper.rb
class Paper < ActiveRecord::Base
  has_many(:priorities, :order => :priority)
  has_many(:authors, :through => :priorities, :order => :priority)
end

# app/models/author.rb
class Author < ActiveRecord::Base
  has_many(:priorities, :order => :priority)
  has_many(:papers, :through => :priorities, :order => :priority)
end

# app/models/priority.rb
class Priority < ActiveRecord::Base
  belongs_to(:author)
  belongs_to(:paper)
  act_as_list(:scope => :paper_id)
end

みたいな. これで複数の author に順番が作成された訳ですが. 正しく動くけど, もっと良い方法がありそうな気がする(実は中間テーブル不要, とか).

あとは登録の所でちょっとゴニョゴニョと. ToDo は dependent です.


連絡先など
最近の日記
  • 2024/10/09
    • 1. Mastodon でのメール通知, というか Exim4 と Apparmor
  • 2024/06/19
    • 1. WSL2 での gpg-agent, ssh-agent
  • 2024/06/18
    • 1. WSL で Windows 側のフォントを利用する
  • 2024/06/17
    • 1. WSLとWindowsの時刻同期
  • 2024/06/12
    • 1. wsl2 で systemd
    • 2. wslg の設定
一覧
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|02|03|04|08|09|10|11|12|
2013|01|02|03|04|05|06|08|09|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|09|10|
2016|02|03|
2017|01|02|03|05|06|07|09|11|12|
2018|03|06|07|10|11|12|
2019|01|02|03|04|05|07|10|12|
2020|01|02|03|04|05|08|09|10|11|12|
2021|01|02|03|05|06|07|08|09|11|12|
2022|01|02|03|04|05|06|08|10|11|12|
2023|02|03|04|06|08|09|11|12|
2024|01|02|03|04|05|06|10|
Back to Top ▲