これは Rails/ActiveRecord に関する質問です。
基本的にイベントやパフォーマンスを表現する必要があるモデルがあります。各イベントには多くの属性があります。属性は基本的に「このイベントでは、人物 X が役割 Y を持っていた」のようなものです。
ユーザーがこのデータを編集できるようにする最善の方法は、構造化された形式を期待するフリー テキスト フィールドを提供することであると結論付けました。これをロール stringと呼びます。
singer: Elvis Costello, songwriter: Paul McCartney, ...
自動補完を使用して、役割の名前 (歌手、ソングライターなど) と人の名前の両方を補完します。ロールと人の両方がデータベースに保存されます。
これを実装するために、Event モデルに仮想属性を作成しました。
def role_string
# assemble a role string from the associations in the model
end
def role_string=(s)
# parse a string in the above role string format,
# look up the People and Events mentioned, and update
# what's in the database
end
これで問題ありません。ロール文字列が適切な形式であり、ロール文字列によって指定された関連付けがすべてチェックアウトされている場合、全体が非常にうまく機能します。
しかし、ロール文字列の形式が正しくない場合はどうなるでしょうか? わかりました、標準の検証と一緒に正規表現を使用して形式を確認できます。
validates_format_of :role_string, :with => /(\w+:\s*\w+)(,\s*\w+:\s*\w+)*/
しかし、ロール文字列によって暗示された関連付けが無効な場合はどうなるでしょうか? たとえば、上記のロール文字列を指定Elvis Costello
し、有効な人物を参照していない場合はどうなりますか?
validates_each
たとえば、属性で使用し:role_string
て関連付けを検索し、指定された名前のいずれかが何にも一致しない場合にエラーをスローできると思いました。
私の質問は 2 つあります。まず、関連付けを検証するには、文字列を解析して検索する必要があるため、このアプローチは好きではありません。これは、関連role_string=
付けを実際にデータベース。
第二に、... この仮想属性への割り当てでエラーが発生したことをどのように示しますか?