Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2007-03-13

genomes(2):1:N関係、Nestした関係

|  genomes(2):1:N関係、Nestした関係 - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  genomes(2):1:N関係、Nestした関係 - KazusaAPI開発日誌  genomes(2):1:N関係、Nestした関係 - KazusaAPI開発日誌 のブックマークコメント

g:kdri:id:nakao_mitsuteru:20070307#p1 の続き。

モデル

生物種(Organismモデル)は複数の染色体/ゲノム/プラスミド(Genomeモデル)を持ち得る。OrganismモデルとGenomeモデルは1:Nの関係になる。

Organismモデル。

class Organism < ActiveRecord::Base
  has_many :genomes
end

Genomeモデル。

class Genome < ActiveRecord::Base
  belongs_to :organism
end

Genome について、Organism に属しているので /organisms/1/genomes や /organisms/1/genomes/1 というようなURLでアクセスしたい。

config/route.rb

map.resources :organisms
#map.resources :genomes
map.resources :organisms do |organisms|
  organisms.resources :genomes	      
end

URL-helpers

route.rb の map.resources を変更したので、URL-helpers が変更される。変更は第一引数にorganism_idを要求する点。

変更前。

<td><%= link_to 'Show', genome_path(genome) %></td>

変更後。

<td><%= link_to 'Show', genome_path(genome.organism, genome) %></td>

これで、http://localhost:3000/organisms/1/genomes でorganism_id == 1の生物種のゲノムのリストが取得できるようになり、http://localhost:3000/organisms/1/genomes/1 でorganism_id == 1の生物種のgenome_id == 1のゲノムが取得できるようになる。

2007-03-07

生物種名や染色体分子名の管理用のデータベースを作成する:genomes (1)

|  生物種名や染色体分子名の管理用のデータベースを作成する:genomes (1) - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  生物種名や染色体分子名の管理用のデータベースを作成する:genomes (1) - KazusaAPI開発日誌  生物種名や染色体分子名の管理用のデータベースを作成する:genomes (1) - KazusaAPI開発日誌 のブックマークコメント

CyanoBase を再構築するときに、生物種ごとの名前空間が必要になったので、それの入れ物をつくる。名前は genomes にしておく。ついでに RESTful な Rails を試してみる。

RESTful Rails については、b-simple.de - Agiles Projektmanagement, Scrum, Softwareentwicklung, Schulungen の PDF チュートリアルを読み進める。

screenshot

アプリケーションの作成

% rails genomes
% cd genomes
% script/server

config/ligthttpd.conf の server.port = 3000 を server.port = 3015 に変更。

lib/tasks/local.rake を作成、require 'rake/clean' を追加。

genomes_development を作成。

scaffold_resource

Genome モデルと Organism モデルなどのファイルを生成。

% script/generate scaffold_resource genome name:string organism_id:integer
% script/generate scaffold_resource organism name:string ncbi_tax_id:string kcode:string
% script/generate migration add_index_organism_id_to_genome
% script/generate migration add_index_kcode_on_organisms
% rake db:migrate

名前空間は organisms がもつ。染色体分子だけでなくプラスミド分子も genomes に入れる。したがって、organism has_many genomes な関係になる。そのようにモデルに関係を追加する。

app/models/genome.rb に belongs_to :organism を追加。

app/models/organism.rb に has_many :genomes を追加。

RESTful

http://localhost:3015/organisms にアクセスするとエントリ数ゼロのページがあらわれる。

New organism のリンクから Editing organism ページへいき、一つエントリを作成する。そして http://localhost:3015/organisms へもどり、エントリが追加されたことを確認する。

http://localhost:3015/organisms.xml にアクセスすると結果が XML で返ってくる。

<?xml version="1.0" encoding="UTF-8"?>
<organisms>
  <organism>
    <id type="integer">1</id>
    <kcode>s6803</kcode>
    <name>Synechocystis sp. PCC 6803</name>
    <ncbi-tax-id>1143</ncbi-tax-id>
  </organism>
</organisms>

フィールド名がそのままタグ名になっている。ただし、_ は - に変換されている。

curl を使うと便利。HTTP-Accept-Field を使う場合。

 % curl -H 'Accept: application/xml" -i -X GET http://localhost:3015/organisms

拡張子を使うアクセスでも同様のxmlが返る。

 % curl -i -X GET http://localhost:3015/organisms.xml