2011-07-31 17 views
1

これはRails 3.0.9アプリケーションです。異なる自動入力が与えられた場合、オートコンプリートアソシエーションを持つレール

placeのモデルは、cityaddressのbelongs_toの関連付けがあり、両方ともhas_many :placesアソシエーションを持っています。 placeモデルは仮想属性を使用し、ビューはjQuery auto_completionを実装しています。 Railscastsのエピソード102のように実装されています。キャストでは、それは単一のcategoryモデルを示しています。しかし、私の実装では、placeモデルが、私は、オートコンプリートを達成するために仮想属性を使用してきましたし、レコードが存在しない場合は、それを作成するために持っている2機種cityaddress

を持っています。

class Place < ActiveRecord::Base 
    belongs_to :city 
    belongs_to :address 

    def city_name 
    city.name if city 
    end 

    def city_name=(name) 
    self.city = City.find_or_create_by_name(name) unless name.blank? 
    end 

    def address_name 
    address.name if address 
    end 

    def address_name=(name) 
    self.address = Address.find_or_create_by_name(name) unless name.blank? 
    end 
end 

これはcityモデルです。 addressモデルもクラス名Addressと同じです。

class City < ActiveRecord::Base 
    has_many :events 
    has_many :places 
    validates :name, :presence => true, 
      :length => {:maximum => 30, :message => "Address can't be longer than 30 chars."}, 
      :uniqueness => {:message => "has already been taken", :case_sensitive => false} 

end 
  • 私はすでにデータベースに格納されている値のthatsとcity_nameaddress_nameである場所を作成しようとするが、それは正常に動作します。
  • 存在しない/新規のcity_nameaddress_nameを追加しようとすると動作します。
  • 既存のレコードと既存のレコードのいずれか、または両方が異なる場合(例:アドレスThamelは存在しますが、私はthamelを入れて(下げ場合)、それは次のようなエラーレポートを吹く:

これは、ログからのバックトレースです:とても奇妙

Processing by PlacesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"5igpohqctBnRUWjPYu6GnXo6btx8SDe/PJRgF2eTG2A=", "place"=>{"name"=>"aaaa", "image_cache"=>"", "category_id"=>"1", "sub_category_id"=>"2", "hot"=>"0", "featured_till_date"=>"", "opens"=>"11 am", "street"=>"", "address_name"=>"thamel", "city_name"=>"pokhara", "description"=>"sdfdsf"}, "commit"=>"Post my Place"} 
    Address Load (0.3ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."name" = 'thamel' LIMIT 1 
    SQL (0.3ms) SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1 
    City Load (0.2ms) SELECT "cities".* FROM "cities" WHERE "cities"."name" = 'pokhara' LIMIT 1 
    SQL (0.3ms) SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = 11 ORDER BY created_at DESC LIMIT 1 
    CACHE (0.0ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."name" = 'thamel' LIMIT 1 
    CACHE (0.0ms) SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1 
    CACHE (0.0ms) SELECT "cities".* FROM "cities" WHERE "cities"."name" = 'pokhara' LIMIT 1 
    CACHE (0.0ms) SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1 
    SQL (0.3ms) SELECT 1 FROM "places" WHERE (LOWER("places"."name") = LOWER('aaaa')) LIMIT 1 
    CACHE (0.0ms) SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1 
    CACHE (0.0ms) SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1 
    AREL (0.5ms) INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849') 
SQLite3::ConstraintException: places.city_id may not be NULL: INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849') 
Completed 500 Internal Server Error in 28625ms 

ActiveRecord::StatementInvalid (SQLite3::ConstraintException: places.city_id may not be NULL: INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849')): 
    app/controllers/places_controller.rb:39:in `create' 

その。私がcity_nameaddress_nameが存在しない場所を作成しようとしたときに、それが期待どおりに動作しない理由は何ですか?

class Place < ActiveRecord::Base 
    belongs_to :city 
    belongs_to :address 

    def city_name 
    city.name if city 
    end 

    def city_name=(name) 
    self.city_id = City.find_or_create_by_name(name).id unless name.blank? 
    end 

    def address_name 
    address.name if address 
    end 

    def address_name=(name) 
    self.address_id = Address.find_or_create_by_name(name).id unless name.blank? 
    end 
end 

答えて

1

はこのようにそれを試してみてください。 dbとアダプタをmysql2に変更しました。同じコードが動作します。

0

実際に問題がsqlite3のDBをしていました:

関連する問題