0

find_or_create_byロケーションモデルで関数を実行しようとしています。属性は保存されていますが、検索または作成機能が機能していません。nameフィールドがあり、入力する'London'と、この値がすでにテーブルにあるにもかかわらず、保存されています。

なぜそうなるのか、何か提案はありますか?

編集:コメントで示唆されているように、before_save呼び出しを追加しました。-まだ同じ問題があります。

Locations.rb

  class Location < ActiveRecord::Base
     before_save :location_check
     has_and_belongs_to_many :posts
     has_many :assets
     attr_accessible :latitude, :longitude, :name, :post_id, :notes, :asset, :assets_attributes
     accepts_nested_attributes_for :assets, :allow_destroy => true
     include Rails.application.routes.url_helpers


   def location_check
    def locations_attributes=(values)
    self.location = Location.find_or_create_by_name(values)
   end
 end  
end

編集:出力ログは次のとおりです。

INSERT INTO "locations" ("created_at", "latitude", "longitude", "name", "notes", "post_id", "updated_at") VALUES (?, ?, ?, ?, ?, 
 ?, ?)  [["created_at", Wed, 14 Nov 2012 19:48:50 UTC +00:00], ["latitude", nil],    ["longitude", nil], ["name", "London"], ["notes", "notes"], ["p
 ost_id", nil], ["updated_at", Wed, 14 Nov 2012 19:48:50 UTC +00:00]] 
4

2 に答える 2

1

コメントに基づいて、次のようにリファクタリングします。

class Location < ActiveRecord::Base
   has_and_belongs_to_many :posts
   has_many :assets
   attr_accessible :latitude, :longitude, :name, :post_id, :notes, :asset, :assets_attributes
   accepts_nested_attributes_for :assets, :allow_destroy => true
   include Rails.application.routes.url_helpers

   validates :name, :uniqueness => true

終わり

次に、コントローラーで次のことを行います。

loc = Location.find_or_create_by_name('London')

そして、あなたが忘れてやろうとした場合:

loc = Location.create(:name => 'London')

そのレコードはすでに存在しているため、一意性の検証に失敗します。

于 2012-11-14T20:01:37.420 に答える
0

あなたが持っていたものと入力された入力との大文字小文字の違いが原因でしょうか?例:ロンドンとロンドン

于 2012-11-14T19:18:21.637 に答える