这是一个Rails 3.0.9应用程序。
以下是place
模型及其与city
和address
的belongs_to关联,两者都有has_many :places
关联。
place
模型使用虚拟属性,视图实现jQuery auto_completion。它在Railscasts第102集中实现。在演员表中,它显示单个category
模型。但在我的实施中,place
模型有2个模型city
和address
我已经使用虚拟属性来完成自动完成,如果记录不存在,则必须创建它。
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
city_name
和address_name
创建一个已存储在数据库中的值时,它可以正常工作。city_name
和address_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_name
和address_name
不存在的地方时,不知道为什么它的行为不符合预期?
答案 0 :(得分:1)
试试这样:
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 :(得分:0)
实际上问题出在sqlite3 db上。 我将db和适配器更改为mysql2,现在相同的代码可以正常工作。