mysql データベースを使用するリンク短縮サービス Sinatra アプリケーションをテストしています。短縮するリンクを入力すると、この mysql エラーが発生します
(mysql_errno=1364, sql_state=HY000) Field 'link_identifier' doesn't have a default value Query: INSERT INTO `urls` (`original`) VALUES ('http://pryrepl.org/screencasts.html')
フィールドlink_identifierにはデフォルト値が必要であることを意味すると思います
URL テーブルと訪問テーブルの両方に link_identifier フィールドがありますが、リンク テーブルにはありません。ただし、以下にコピーしたテーブルを作成するコードでは、「プロパティ :identifier」を持つのは Link クラスです。この問題を解決する方法を知っている人はいますか?
mysql> show columns from urls;
+-----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| original | varchar(255) | YES | | NULL | |
| link_identifier | varchar(50) | NO | MUL | NULL | |
+-----------------+------------------+------+-----+---------+----------------+
3 rows in set (0.12 sec)
mysql> show columns from visits
-> ;
+-----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created_at | datetime | YES | | NULL | |
| ip | varchar(39) | YES | | NULL | |
| country | varchar(50) | YES | | NULL | |
| link_identifier | varchar(50) | NO | MUL | NULL | |
+-----------------+------------------+------+-----+---------+----------------+
5 rows in set (0.08 sec)
mysql> show columns from links
-> ;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| identifier | varchar(50) | NO | PRI | NULL | |
| created_at | datetime | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
コード
class Url
include DataMapper::Resource
property :id, Serial
property :original, String, :length => 255
belongs_to :link
end
....
class Link
include DataMapper::Resource
property :identifier, String, :key => true
property :created_at, DateTime
has 1, :url
has n, :visits
...
class Visit
include DataMapper::Resource
property :id, Serial
property :created_at, DateTime
property :ip, IPAddress
property :country, String
belongs_to :link
after :create, :set_country
....
更新 - ソース コードには、mysql の要件を満たすリンク識別子を作成する方法が既にあるようですが、機能していないようです。
def self.create_link(original)
url = Url.create(:original => original)
if Link.first(:identifier => url.id.to_s(36)).nil? or !DIRTY_WORDS.include? url.id.to_s(36)
link = Link.new(:identifier => url.id.to_s(36))
link.url = url
link.save
return link
else
create_link(original)
end
end
end