私の Ruby on Rails 3.2.3 アプリケーションでは、has_many スルー リレーションシップを介して 3 番目のモデルを介して接続された 2 つのモデルがあります。
class Organization < ActiveRecord::Base
attr_accessible :description, :name
has_many :roles, dependent: :destroy
has_many :members, through: :roles, source: :user
end
class Role < ActiveRecord::Base
attr_accessible :title
belongs_to :organization
belongs_to :user
end
class User < ActiveRecord::Base
attr_accessible :email, :fullname
has_many :roles, dependent: :destroy
has_many :organizations, through: :roles
end
User
を に関連付けたいOrganization
。ただし、title
上の属性をRole
指定する必要があります。これを強制するために、MySQL でtitle
フィールドを に設定しました。NOT NULL
Rails コンソールでは次のようになります。
>> o = Organization.first
>> u = User.first
>> o.members << u
(0.1ms) BEGIN
SQL (0.4ms) INSERT INTO `roles` (`created_at`, `organization_id`, `title`, `updated_at`, `user_id`) VALUES ('2012-11-22 08:37:23', 1, NULL, '2012-11-22 08:37:23', 1)
Mysql2::Error: Column 'title' cannot be null: INSERT INTO `roles` (`created_at`, `organization_id`, `title`, `updated_at`, `user_id`) VALUES ('2012-11-22 08:37:23', 1, NULL, '2012-11-22 08:37:23', 1)
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: Mysql2::Error: Column 'title' cannot be null: INSERT INTO `roles` (`created_at`, `organization_id`, `title`, `updated_at`, `user_id`) VALUES ('2012-11-22 08:37:23', 1, NULL, '2012-11-22 08:37:23', 1)
from /path/...
Role
インスタンスを直接作成できることを知っています。しかし、<<
演算子を使用するときに結合テーブルの属性を指定するより洗練された方法は何ですか?