私のomniauth&omniauth-identityベースのアプリで、次の問題に遭遇しました:
Userdata を管理する 3 つのテーブルがあります。
# Stores User data _not_ authentication data
class User
include Mongoid::Document
has_many :identities
field :email, type: String
end
# Stores Authentication data (i.e. Facebook)
class Identity
include Mongoid::Document
belongs_to :user
end
# Stores Authentication data for omniauth-identity
class LocalIdentity < Identity
include OmniAuth::Identity::Models::Mongoid
field :email, type: String
end
問題は、 でメール フィールドを複製したことLocalIdentityです。そのため、ユーザーがモデル内の電子メール アドレスを変更するたびに、User電子メール アドレスを同期する必要があります。これは最初は些細なことのように見えますが、関連するフィールドが増えるとすぐに非常に面倒になります。
だから私の質問は: と の間の冗長性を取り除く方法はありUserますLocalIdentityか?
解決策について熟考しているうちに、次の結論に達しました。
- マルチ継承はサポートされていないため、機能し
LocalIdentity < Identity, Userません - every と write-troughに
LocalIdentity埋め込まれUserた値は機能しません b/c 検証は機能しません