4

私の 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インスタンスを直接作成できることを知っています。しかし、<<演算子を使用するときに結合テーブルの属性を指定するより洗練された方法は何ですか?

4

1 に答える 1

0

そこに属していない情報でrolesテーブルを更新しようとしていると思います。あなたの場合、役割名は、参加テーブルではなく、組織またはユーザーのいずれかに含まれている必要があります。親モデルに含めるか、さらに良い方法として、ロールをユーザーに接続できるように別の結合テーブルを作成します。

class role_users < ActiveRecord::Base
  attr_accessible :user_id, role_id
  belongs_to :user
  belongs_to :role
end

class Roles < ActiveRecord::Base
  attr_accessible :title, :foo, :bar
  has_many :role_users
  has_many :users, :through => :role_users
end    

class Users < ActiveRecord::Base
  attr_accessible :other, :foo, :bar
  has_many :role_users
  has_many :roles, :through => :role_users
end

次に、これらの役割を私たちと同じように自分で設定し、チェックボックスを追加するか、ユーザーが選択できるようにドロップダウンします。または、ユーザーが自分で情報を入力できるようにします。

于 2012-11-22T09:19:20.537 に答える