2016-04-14 7 views
0

BELONGS_TO私は単純な関係を持っているにhas_one /アプローチ

<%= f.simple_fields_for :locker do |l| %> 
    <%= l.input :id, as: :select, 
     collection: @lockers_collection, 
     label: false, 
     value_method: :id, 
     label_method: :number, 
     include_blank: true, 
     input_html: { class: "admin-select2" }, 
     selected: "#{@student.locker ? @student.locker.id : ""}", 
     wrapper: 'admin_vertical_select' -%> 
<% end -%> 

私は新しい学生が、私は(またはしない)ロッカーを割り当てることができます作成​​しています、すべてがシンプルであり、期待通りに機能します。編集/更新アクションがあると、私は大きな問題を持っているもの、とにかく

def locker_attributes=(attributes) 
    if attributes['id'].present? 
    self.locker = Locker.find(attributes['id']) 
    end 
    super 
end 

:まあ、私はそうRailsはレコード(SO上でここに見つける液)を見つけることではない不満た、学生モデルにこのハックを追加する必要がありました。 まず、私は学生は現在、新しいものを構築したり、既存のためのロッカーかを持っているかどうかを確認する必要があります。今すぐ

if @student.locker 
    @student.build_locker(id: @student.locker.id) 
else 
    @student.build_locker 
end 

私は解決策を見つけようとしています実際の問題を。 基本的に起こるシナリオはわずかです:

  • 学生はロッカーを持っておらず、ロッカーを持っていません。
  • 学生にはロッカーがありますが、私は(私は疑う)ロッカーが空であるので、それはこの2つのシナリオの学生で

    が更新されないクリアしたいです。これに対処する方法は?

また、ロッカーを切り替える可能性もあります。 この場合、私は何とかRailsが "古い"ロッカーを更新するほどスマートになると思っていました。古いロッカーのstudent_id IDがnilであることがわかりますが、Railsはどうしていますか?問題は私がロッカーにpaper_trailを持っていて、古いものが空になったらバージョン管理する必要があることです。

空のシナリオをどのように扱いますか?これが私の最大の問題です。 私はそれを正しくやっているのですか、それを行う良い方法がありますか?

Thxを

答えて

0

あなたのようなあなたのモデルで、あなたの団体にinverse_ofを追加する場合:

  • 学生:has_one :locker, inverse_of: :student
  • ロッカー:belongs_to :student, inverse_of: :locker

あなただけ使用することができます:

@student.build_locker unless @student.locker 

def locker_attributes=(attributes)メソッドは必要ありません。

@student.locker = nil 
@student.save 
+0

ちょっとマリオ:あなたはこのようないくつかのコントローラ内のアクションに以下を追加することができロッカーを無効にする

。私は実際にinverse_ofを定義していますが、それを言い忘れました。私は私の質問を更新します。とにかく、それはその方法なしでは動作しません。 –

+0

質問を更新しました –

+0

私はロッカーを無効にして保存することはできません。生徒の他の属性が変更されたらどうなりますか?住所などのような... –

関連する問題