0

ひょっとして、DataMapper で条件付き関連付けを作成することは可能ですか?

例えば:

そのユーザーが属性を持っている場合にのみ、ユーザーにn個のアプリを持たせたい:developer => true

このようなもの:

class User
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :nullable => false
  property :screen_name, String, :nullable => false, :unique => true
  property :email, String, :nullable => false, :unique => true, :format => :email_address
  property :password, BCryptHash, :nullable => false
  property :developer, Boolean, :default => false

  #The user just gets apps if developer
  has n :apps #,:conditions => "developer = 't'"

end

class App
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :nullable => false

  belongs_to :user
end

User から Developer::User としてサブクラスを作成し、そのクラスで を使用することでこれがhas n可能になることはわかっていますが、関連宣言で直接作成できるかどうかを知りたいです。

ARn を使用するときに私が何とかできたもう 1 つの方法は、関連付けを拡張し、各アクションのメソッドを書き直すことでした。

したがって、拡張モジュールでは、次のようなものを使用できます。

module PreventDeveloperActions
  def new
    if proxy_owner.developer?
       super
    else
       raise NoMethodError, "Only Developers can create new applications"
    end
  end

 # and so on for all the actions ...
end

しかし、繰り返しになりますが、可能であればこのソリューションの使用を避けたいと思いますが、DataMapper を使用して迅速かつ直接的な方法を簡単に実行できる場合に限ります :)

前もって感謝します

4

1 に答える 1

2

現時点では、関係宣言に含める条件はターゲットにのみ適用されます。したがって、ターゲット モデルに :active プロパティがある場合は、次のように指定できますhas n, :apps, :active => true。残念ながら、ソースの現在の状態 (まだ) を考慮してのみアクティブな関係を定義することはできません。

DM でクエリ ロジックを拡張することを検討している提案がいくつかありますが、コードにどのような影響が及ぶのか、これ以外にどのような追加機能が提供されるのかはわかりません。50 以上のアダプターとプラグインにも影響するため、DM 1.0 以降に対処する可能性があります。

STI は、そのタイプのオブジェクトにのみ存在する関係を定義できるため、通常、このようなものに推奨します。もう 1 つのアプローチは、リレーションシップを通常として定義し、アクセサー/ミューテーター メソッドをプライベートとしてマークし、次に同等の処理を行うプロキシ メソッドを追加することですreturn apps if developer?

于 2009-11-30T06:54:59.823 に答える