0

Rails 3.2.11 と Ruby 1.9.3 を使用する場合:

Review、User、および ReviewAccess クラスがあります

class ReviewAccess < ActiveRecord::Base
  belongs_to :user
  belongs_to :review
  attr_accessible :role_id
end

class Review < ActiveRecord::Base
  has_one :review_accesses_owner, :class_name => 'ReviewAccess',
    :conditions => "review_accesses.role_id = 1"
  has_one :owner, :class_name => 'User', :through => :review_accesses_owner,
   :source => :user
end

基本的に Review は User との多対多であり、結合テーブルは ReviewAccess であり、さらに role_id 列に関係ロール (所有者の場合は 1) を保持します。レビューの所有者は次の方法で読み取ることができます。

Review.owner  # works
# sql: SELECT "review_accesses".* FROM "review_accesses" WHERE "review_accesses"."review_id" = 7 AND (review_accesses.role_id = 1) LIMIT 1

ただし、role_id が 1 に設定されていないため (関連付けの条件句に記載されているように)、所有者の設定は機能しません。

Review.owner = current_user  # does not set role_id
# sql: INSERT INTO "review_accesses" ("created_at", "review_id", "role_id", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Sun, 27 Oct 2013 08:02:54 UTC +00:00], ["review_id", 7], ["role_id", nil], ["updated_at", Sun, 27 Oct 2013 08:02:54 UTC +00:00], ["user_id", 1]]

owner= をオーバーライドできることはわかっていますが、(ロールごとに) これらの多くがあり、代わりに関連付け DSL を使用したいと考えています。

作成時に条件を設定する条件を持つ関連付けを更新する方法は?

4

1 に答える 1

0

DSL を使用するのは良い選択ではないのではないかと少し心配しています。

  1. カスタム動作を追加する必要がある場合は、コードをコールバックに入れるよりもアクセサーをオーバーライドすることをお勧めします。
  2. 一部の一般的な反復メソッドには、メタプログラミングのものを使用します。多くの役割がある場合でも、関連付けの定義に DRY があるため、問題は同じですが、場所が異なります。

要約すると、メタプログラミングを使用してライターをオーバーライドします。役割の配列があるところならどこでもいいですよね?

于 2013-10-27T08:31:00.243 に答える