1

ここ数時間、苦労して取り組んできた課題があります。

ネストされた属性を持つフォームがあります。各投稿には多くの場所があり、それらに属しています。それぞれの場所を一意にする必要がありますが、同じ場所を多くの投稿に追加できる必要もあります。理想的には、この検証はモデル内で行われます。

  • したがって、私の投稿フォームでは、ユーザーが「場所を追加」してから、foursquareAPIで場所を検索します。
  • 送信すると、これは場所の名前と経度と緯度とともにLocationsテーブルに保存され、これらを結び付けるLocations_Postsテーブルがあります。
  • 発生する必要があるのは、投稿モデルが場所が存在するかどうかを確認する必要があることです。存在する場合は、場所に何も追加せず、関連するデータをLocations_Postsテーブルに追加するだけです。

いくつかの調査の結果、私は次のようなものが必要であることがわかりました。

*Posts.rb*

# =================
# = Location validations = 
# = If location exists then just add to locations_posts, else create new location =

def locations_attributes
location && location.name
end

def locations_attributes=(value)
self.location = Location.find_by_name(value)
self.location ||= Location.new(:name => value)
end

(Railsから盗まれた:子レコードを作成しながら、存在しない場合は親を作成します

ただし、次のようなエラーが発生します。

Unknown key: 0

私はこのスニペットに近づいている必要があると思いますが、最後のハードルを乗り越えるためにいくつかの助けが必要です!

前もって感謝します、

ジェームズ

4

2 に答える 2

1

使用してみてください:

def locations_attributes=(value)
  self.location = Location.find_or_create_by_name(value)
end
于 2012-11-04T15:52:17.123 に答える
0

Rails 4では、これは完全に機能しました。ありがとうございます。

def locations_attributes=(value)
  self.location = Location.find_or_create_by(value)
end

これにより、場所に渡されたすべての属性の一意性がチェックされます。

于 2013-12-13T15:03:30.283 に答える