4

Play で特定のフィールド セットのみをデータベースに更新するにはどうすればよいですか? 現在User、特定のフィールドを含むモデルがあります。それを呼び出しましょう: isAdministrator:

private boolean isAdministrator;

そして、私はアクセサメソッドを持っています:

/**
 * @return the isAdministrator
 */
public boolean isAdministrator() {
    return isAdministrator;
}

/**
 * @param isAdministrator
 *            the isAdministrator to set
 */
public void setAdministrator(boolean isAdministrator) {
    this.isAdministrator = isAdministrator;
}

しかし、isAdministrator含まれていないフォームを介してユーザー名を変更すると、Play は User オブジェクトをリセットし、0このユーザーの値を設定しますか?

では、変更されたフィールドのみを更新するにはどうすればよいでしょうか?

4

3 に答える 3

4

私はあなたの質問に直接答えませんが、ユーザーが管理者であるかどうかを示すブール値を持つ代わりに、Adminユーザーから継承するクラスを作成します。

public class Admin extends User {
....
}

SOLIDの「S」です;-)

編集:

コントローラーでは、フォームの値で更新する前に、データベースから古い値をロードできます。

...
User userFromDB = User.findById(anId);
User userFromForm = userForm.get();

// set previous value
userFromForm.setArchived(userFromDB.getArchived());

User.update(userFromForm);
...
于 2012-07-27T15:15:40.323 に答える
2

ニコの答えに加えて、私が追加できるのはForm、すべての場合にクラスを使用する必要がないということだけです。リクエストからデータを取得し、オブジェクトを手動で更新するだけで十分な場合もあります。これは、詳細レベルの中間保存がある場合に特に ajax 呼び出しで役立ちます ( DynamicFormの使用例を参照してください。さらに短くすることができ、自分で検証することもできます

public static Result updateName(Integer id){
    User user = User.find.byId(id);
    user.name = form().bindFromRequest().get("name");
    user.update(id);
    return ok();
}
于 2012-07-27T16:30:09.877 に答える