トップページ⇒php
1001コメント455KB

【RoR】Ruby on Rails Part12

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/07/19(火) 13:44:46.30ID:zxrusyvr
■前
【Ruby】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/

■参考サイト
<英語>
本家:http://rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
http://ruby-toolbox.com/
http://rubygems.org/
http://agilewebdevelopment.com/plugins/top_rated

<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/

http://twitter.com/dhh
http://www.loudthinking.com/
0101nobodyさん2011/07/25(月) 12:12:33.69ID:???
掲示板とか 決まりきった機能 を組み込んでIDとパスワードを渡すだけで
すぐ使えるような組み込み型のモジュールとかってあるんですか?

あるとしたら、こういうタイプの組み込み型モジュールの呼称って何ですか?
0102nobodyさん2011/07/25(月) 12:20:36.38ID:eJ//7zAn
engines
0103nobodyさん2011/07/25(月) 12:42:20.17ID:???
>>102
ありがとう!調べてみたらログイン用とかあるんですね。

普通はwebサービスとか作る時って
自分で一から作るものですか?
それともこういったエンジンを部分利用して作業を極力軽減するのかな?
0104nobodyさん2011/07/25(月) 12:53:52.76ID:???
CMS作るときに、とあるStringフィールドを設けようと思います。

ただし、このフィールドは

英字のみだったり、
英数のみだったり、
半角のみだったり、
数字4桁+数字4桁+数字4桁だったり、
全角可能だったりと

フォーム入力時点のユーザー毎にバリデーションが異なります。

こういうのって標準のバリデーションではなく
正規表現を使って、それぞれのバリデーション検証を行うのが正しいですか?

また、そのユーザーのバリデーションパターンを決めるのも第三者が
フォーム入力で決めていく形です。

どういう流れに持っていくのが一般的ですか?
0105132011/07/25(月) 14:01:51.45ID:IAHMsfps
>>100 のものです。
<% @vegetables = Vegetable.find(:all, :conditions=>@condition).each do |vegetable| -%>
を
<% @vegetables = Vegetable.find(:all, :conditions=>[@condition]).each do |vegetable| -%>
としましたが、結果は同じでした。

@conditionが別に定義されているかも知れないので@cndなど別の変数にしたが結果は同じでした。

undefined method `%' for ["[\""]:Arrayというエラーはググッても1件も出てきません・・・。

当方Rails2.3.8です。

宜しくお願い致します。
0106nobodyさん2011/07/25(月) 16:34:48.91ID:???
>>105
Rails2.3.8で似たようなコードを書いてもエラーにはなりませんでした。
そもそも、[ "[\"" ] というlength=1の配列はどこから来ているのかが気になりますね。

@conditionの定義部分でタイポとかないでしょうか?
0107132011/07/25(月) 16:45:54.91ID:IAHMsfps
>>106
vegetables_controller.rbに
if params[:hinmoku_id]
@cnd = []
@cnd << ["[ \""]
@cnd << ["hinmoku = ? "]
end
と、直書きしてます。

でも@cnd << ["[ \""]を削っても、
undefined method `%' for ["hinmoku = ? "]:Array
となって同じでした。
0108nobodyさん2011/07/25(月) 16:53:52.10ID:???
[" hinmoku = ? and kaikyu = ? and kikaku1 = ? and kikaku2 = ? ", '玉ねぎ', 'L', '3', '個ネット']
としたいんですよね。
であれば、<< ではなくて、+= じゃないですかね。

controllerで、
logger.debug @cnd.inspect
や
viewで
<%=h @cnd.inspect %>
で見てみると、@cndが2重配列になっていると思います。
0109nobodyさん2011/07/25(月) 17:22:43.37ID:???
>>107
と、根本的なところですが、Viewでfindとかを書くのはあまり推奨されないので、
こんな感じでリファクタリングしていくと良いかなと思います。

Rails2.3.4から標準で入っているnamed_scopeと
named_scopeをデフォルトで色々定義してくれるsearchlogicというpluginを使って
https://github.com/binarylogic/searchlogic

1回目のリファクタリング
[controller]
search = Vegetable
search = search.hinmoku_id_eq(params[:hinmoku_id]) if !params[:hinmoku_id].blank?
search = search.kaikyu_id_eq(params[:kaikyu_id]) if !params[:kaikyu_id].blank?
search = search.kikaku1_id_eq(params[:kikaku1_id]) if !params[:kikaku1_id].blank?
search = search.kikaku2_id_eq(params[:kikaku2_id]) if !params[:kikaku2_id].blank?
@vegetables = search.all
0110nobodyさん2011/07/25(月) 17:24:50.46ID:???
>>109 続き
このままだとcontrollerが肥大化してしまうので、modelに回します。
2回目のリファクタリング
[controller]
@vegetables = Vegetable.search(params).all

[model]
class Vegetable
def self.search(params={})
search = self
search = search.hinmoku_id_eq(params[:hinmoku_id]) if !params[:hinmoku_id].blank?
search = search.kaikyu_id_eq(params[:kaikyu_id]) if !params[:kaikyu_id].blank?
search = search.kikaku1_id_eq(params[:kikaku1_id]) if !params[:kikaku1_id].blank?
search = search.kikaku2_id_eq(params[:kikaku2_id]) if !params[:kikaku2_id].blank?
search
end
end
0111nobodyさん2011/07/25(月) 17:26:08.12ID:???
>>110 続き で、3回目のリファクタリングで
modelのメソッドをArrayのinjectと、文字列からメソッド発行ができるsendを使ってスリムに
[model]
class Vegetable
def self.search(params={})
[:hinmoku_id, :kaikyu_id, :kikaku1_id, :kikaku2_id].inject(self){|search, param| params[param].blank? ? search : search.send("#{param}_eq",params[param]) }
end
end

動作未検証ですが、参考までに。
0112132011/07/25(月) 17:42:26.98ID:IAHMsfps
>>108
<%=h @cnd.inspect %>
でみると、
["\"", "hinmoku = ? ", "and kaikyu = ? ", "and kikaku1 = ? ", "and kikaku2 = ?", "\"", ", '", "バナナ", "'", ", '", "2L秀", "'", ", '", 5, "'", ", '", "個ネット", "'"]
になってました。

でも、"とか\を取ると、それはそれで動かなくなるんですが、
根本的に記載方法を間違えているのでしょうか???
0113nobodyさん2011/07/25(月) 17:58:46.67ID:???
そもそも何で"\""を配列に入れようとしているのか…
>>100 を素直に代入すればいいだけだと思うが…
0114132011/07/25(月) 17:58:53.48ID:???
>>109
書き込み気付きました。
のちのちのメンテを考えるときれいにしときたいので、
頂いたアドバイスをもとに頑張ってみます
0115nobodyさん2011/07/25(月) 17:59:48.06ID:???
>>112
[" hinmoku = ? and kaikyu = ? and kikaku1 = ? and kikaku2 = ? ", '玉ねぎ', 'L', '3', '個ネット']
になるようにゴリゴリ書けば、
@cnd_first = []
@cnd_last = []

[hinmoku]
@cnd_first << "hinmoku = ?"
@cnd_last << "タマネギ"
[kaikyu]
@cnd_first << "kaikyu = ?"
@cnd_last << "L"

@cnd = [@cnd_first.join(" and ")] + @cnd_last

でいけるかな
0116132011/07/25(月) 18:01:29.60ID:???
>>113
[" hinmoku = ? and kaikyu = ? and kikaku1 = ? and kikaku2 = ? ", '玉ねぎ', 'L', '3', '個ネット']
を再現するように、
["を書くために"[\""て書きました。
0117nobodyさん2011/07/25(月) 18:05:55.04ID:???
あぁ…全部文字列だと思ってたのね…

Rail がどーたら言う前に、Ruby を勉強した方がいいよ
その方が問題解決にはずっと近道だし、今後似たようなことで悩まなくてよくなるから
0118nobodyさん2011/07/25(月) 18:17:18.52ID:eJ//7zAn

テッチャン☆ぶろぐ: [Rails]searchlogic v2でテーブルのソート的なもの。
http://shasou.blogspot.com/2010/02/railssearchlogic-v2.html

スリムになったSearchlogic v2をいじってみた - MothProgのうしろがわ
http://d.hatena.ne.jp/mothprog/20090819/1250692210

https://github.com/binarylogic/searchlogic
http://asciicasts.com/episodes/176-searchlogic
0119nobodyさん2011/07/25(月) 18:46:03.06ID:G/8niHgC

students = Student.scoped_by_name_and_grade("Ana", 2).all
ttp://d.hatena.ne.jp/mothprog/20090819/1250692210
0120nobodyさん2011/07/25(月) 18:51:27.50ID:eJ//7zAn
Searchlogic
http://railscasts.com/episodes/176-searchlogic

Episode 111: Advanced Search Form
http://railscasts.com/episodes/111-advanced-search-form

Make searching and ordering data in your application trivial
https://github.com/binarylogic/searchlogic
0121nobodyさん2011/07/26(火) 11:05:09.95ID:???
ログイン系のプラグインでCaptchaが標準でついてるのはないのかな?
0122nobodyさん2011/07/26(火) 11:54:53.75ID:???
ログインとCaptchaって意味ないと思うが…
サインアップなら分かるが
0123nobodyさん2011/07/26(火) 12:05:05.74ID:???
>>122
サインアップ機能(ログイン機能つき)でCaptcha付きのことです
0124nobodyさん2011/07/26(火) 12:17:22.22ID:???
>>121
このへん?
https://github.com/plataformatec/devise/wiki/How-To:-Use-Recaptcha-with-Devise

Google の Recaptcha を使うようだが
0125nobodyさん2011/07/26(火) 12:31:51.33ID:QroQWCDs
[Rails]Rails+MySQLで文字セット照合順序(collation)を変更する | DENPA GROOVE
http://jokami.mydns.jp/2011/05/25/railsrailsmysqlで文字セット照合順序(collation)を変更する/
0126nobodyさん2011/07/26(火) 12:40:36.04ID:???
>>124
これって、ただのキャプチャ単体ですよね?
探してるのはキャプチャが組み込まれているログイン管理・新規登録機能プラグインです。
0127nobodyさん2011/07/26(火) 12:57:27.97ID:???
>>126
よく嫁
そのページはdeviseという認証機能プラグインのプロジェクトの中にあるだろ
0128nobodyさん2011/07/26(火) 13:08:32.65ID:???
「それはラジオよ。」

友達のおばちゃんに言われた。

0129nobodyさん2011/07/26(火) 13:54:41.22ID:QroQWCDs

reCAPTCHA: Stop Spam, Read Books
http://www.google.com/recaptcha

Google Acquires reCAPTCHA
http://mashable.com/2009/09/16/google-acquires-recaptcha/
0130nobodyさん2011/07/26(火) 14:01:13.57ID:QroQWCDs
ambethia/recaptcha - GitHub
https://github.com/ambethia/recaptcha
0131nobodyさん2011/07/26(火) 14:38:52.54ID:???
deviseはサインアップ時の確認画面がないのがちょっと
0132nobodyさん2011/07/26(火) 14:40:49.73ID:???
だったら自分で作れ
0133nobodyさん2011/07/26(火) 14:51:18.42ID:???
作ったけど何か?
0134nobodyさん2011/07/26(火) 17:19:42.49ID:QroQWCDs
rails searchlogic plugin search in multiple columns - ruby-on-rails - DoExpert
http://www.doexpert.net/a/4e1754e4592b0a27c02867dc

http://b.hatena.ne.jp/t/searchlogic?sort=eid
0135nobodyさん2011/07/26(火) 21:29:54.59ID:???
しかし、確認画面って日本独特なんだろうね。
サインアップで間違っても、編集ページで直せば良いじゃん。ってことなんだろつ。
0136nobodyさん2011/07/27(水) 22:35:28.41ID:ZS4k7BV+
Slim - A Fast, Lightweight Template Engine for Ruby  
http://slim-lang.com/
0137nobodyさん2011/07/28(木) 09:43:39.08ID:???
http://designpatternsinruby.com/
ここ、開けないんだけどなんでだろ?
本のサンプル落としたいのに・・・・。

0138nobodyさん2011/07/28(木) 12:05:30.82ID:???
rails2.x
rails3.x

それぞれでの
主流のログイン認証プラグインとgemって何がある?
出来れば今もサポートされてるので。
0139nobodyさん2011/07/28(木) 12:08:05.40ID:???
>>138
http://ruby-toolbox.com/categories/rails_authentication.html
0140nobodyさん2011/07/28(木) 23:53:05.56ID:4Q9csvAm
O'Reilly OSCON Java 2011, Raffi Krikorian, "Twitter: From Ruby on Rails to the JVM"
 http://www.youtube.com/watch?v=ohHdZXnsNi8
0141nobodyさん2011/07/29(金) 00:13:17.03ID:Tkg/4Pbb
vigetlabs/simplest_auth - GitHub
https://github.com/vigetlabs/simplest_auth
0142nobodyさん2011/07/29(金) 02:46:50.92ID:Tkg/4Pbb


Githubにソースコードがあったらボタン1つでデプロイすることが出来る。
http://www.ninxit.com/blog/2011/07/28/python-flask-fluxfle/

One Click Install Software Library
WordPress 3.1.3 (Japanese)
Redmine 1.2-stable
http://www.fluxflex.com/library

fluxflex ドキュメント
http://jp.doc.fluxflex.com/

http://www.youtube.com/watch?v=iyqWyZVXl6g
0143nobodyさん2011/07/29(金) 15:17:50.97ID:NreIb2ba
既存のレコードをeditで編集し変更した内容を
submitボタンを2つにしてそのままupdateと新規insertにしたい。

もしくはレコードのコピー+idの採番

をしたいのですが、どうやったら可能でしょうか?
0144nobodyさん2011/07/29(金) 15:31:54.32ID:Tkg/4Pbb
高トラフィックサイトをRailsで構築するためのTips基礎編
http://www.slideshare.net/kaznum/railstips

Gregg PollackとScaling Railsのハウツー
1つには、Railsアプリケーションをうまくスケーリングするために必要なすべての情報をRails開発者に与えること。
開発者は、これらの技術を使用する必要はないかもしれません。
しかし、できれば、開発者がビデオを見て、何百万人の同時ユーザーを扱うRailsアプリケーションを
作成できます、とクライアントに言える自信を持ってもらいたいのです。
2番目に、Railsアプリケーションをスケーリングすることがどれほど簡単かを、他の言語の開発者に示すこと。
http://www.infoq.com/jp/articles/gregg-pollack-scaling-rails

Ruby Proxies for Scale, Performance, and Monitoring
http://www.slideshare.net/igrigorik/ruby-proxies-for-scale-performance-and-monitoring-gogaruco-igvitacom-1396734

osc2008_opensuse-moonlinx.pdf (application/pdf オブジェクト)
Perlbal
http://blog.geeko.jp/wp-content/uploads/2008/09/osc2008_opensuse-moonlinx.pdf
0145nobodyさん2011/07/29(金) 17:33:27.53ID:NreIb2ba
143です。
もしくは、indexのshow | edit | destroyにcopyとつけても良いです。

試しにlink_to '複製', new_vegetable_path(vegetable)としたら
真っ白になりました・・・。
0146nobodyさん2011/07/29(金) 19:43:08.17ID:Tkg/4Pbb
Rails アプリを nginx の拡張モジュールで置き換えて高速化する方法 - HeartRails Tech Blog
毎秒 1000 アクセスはクリア。CPU の使用率は 25% 前後
http://techblog.heartrails.com/2011/01/rails-nginx.html
0147nobodyさん2011/07/29(金) 19:50:18.37ID:Tkg/4Pbb
Apacheに対するDOS攻撃を回避する「mod_evasive」 (ひるねこ日記)
http://www.aubetec.com/hiruneko/blog/archives/2007/05/apachedosmod_evasive.html

mitukiii.jp | UbuntuのApacheにDOS攻撃を回避するmod_evasive入れた
http://mitukiii.jp/2010/12/19/ubuntu-apache-install-mod-evasive/

Apache DoS攻撃対策 mod_evasiveインストール | Satake Studio Developer's Blog
sudo apt-get install libapache2-mod-evasive
http://dev.satake7.net/2010/05/05/apache-dos攻撃対策-mod_evasiveインストール/

http://blog.bodhizazen.net/linux/how-to-mod_evasive-ubuntu-904/
0148nobodyさん2011/07/29(金) 21:08:00.14ID:JxuS3wyn
>>143
submitに名前を付けておいて受け取った側で識別、
createとupdateを呼び分ける。
0149nobodyさん2011/07/30(土) 01:02:16.68ID:???
>>145
copyの方がviewの無理がないので、自分ならそっちにします。

newに飛ばしても当然ダメなので、controllerにmethod追加かな。
0150nobodyさん2011/07/30(土) 01:18:55.43ID:K7JH1lDj


O'Reilly OSCON Java 2011, Raffi Krikorian, "Twitter: From Ruby on Rails to the JVM"
http://www.youtube.com/watch?v=ohHdZXnsNi8

OpenFeintジェイソン・シトロンCEOに独占インタビュー/Tech総研
ちなみに、僕らのプラットフォームは、Ruby on Railsで開発されています。
http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001896

Airbnb: Which programming languages does Airbnb use? - Quora
http://www.quora.com/Airbnb/Which-programming-languages-does-Airbnb-use?

Inside Groupon: RailsConf 2011 - O'Reilly Conferences, May 16 - 19, 2011, Baltimore, MD!
http://en.oreilly.com/rails2011/public/schedule/detail/17691

Hulu is built on Ruby on Rails.
http://techcrunch.com/2008/01/24/hulu-discusses-private-beta-suggests-public-launch-time-frame/

http://ruby50.com/
0151nobodyさん2011/07/30(土) 07:35:59.46ID:K7JH1lDj
21 Ruby Tricks You Should Be Using In Your Own Code
http://www.rubyinside.com/21-ruby-tricks-902.html

19 Rails Tricks Most Rails Coders Don't Know
http://www.rubyinside.com/19-rails-tricks-most-rails-coders-dont-know-131.html
01521432011/07/30(土) 13:14:39.45ID:4R4YZGj/
>>149
[view]のindexに、show | edit | destroyにcopyを追加
link_to 'copy', vegetable, :action => :copy, :method => "POST"

[controller]
# POST /vegetables
# POST /vegetables.xml
def copy
@vegetable_g = Vegetable.find(params[:id])
@vegetable = Vegetable.new(params[:vegetable_g])

# respond_to do |format|
# format.html { redirect_to(vegetables_url, :notice => '青果見積の複製が完了しました') }
# format.xml { head :ok }
# end

respond_to do |format|
format.html { render :action => "index" }
format.xml { render :xml => @vegetables }
end
end

[error]
白い画面に
Unknown action
No action responded to 11. Actions: copy, create, destroy, edit, index, new, search, show, and update
とでて動きません・・・。
0153nobodyさん2011/07/30(土) 13:57:37.37ID:jkxkSy7w
>>152

RESTルーティング書いた?

resources :vegetables do
member do
post :copy
end
end

と書くと、 copy_vegetable_url(id) or copy_vegetable_path(id) を使って
/vegetables/:id/copy に POST できるとおもう。
01541432011/07/30(土) 14:44:49.60ID:4R4YZGj/
>>153
route.rbに以下を書いていました。
map.connect 'vegetables/copy', :controller => 'vegetables', :action => 'copy'

頂いたコードを記入しましたが、動きません。当方Rails2.3.8です。
0155nobodyさん2011/07/30(土) 15:02:20.15ID:jkxkSy7w
2系だったか。

エラーメッセージをよく見ると、copy はアクションの一覧にあるな。
でもって 11 がアクションだと見なされているように見える。

link_to 'copy', vegetable, :action => :copy, :method => "POST"
は、
link_to 'copy, :action => :cppy, :id => :vegetable.id, :method => 'post'
だろうか、と思ったが、link_to(=アンカー要素)でPOSTって出来るの?
3系のUnobtrusive JavsScriptを使った奴は裏でformをつくってそこからPOSTしてくれるけど。

あと、とりあえず rake routes。

0156nobodyさん2011/07/30(土) 15:06:04.33ID:jkxkSy7w
2だと、 link_to_remote を使ってAJAXでPOSTするのかな。
01571432011/07/30(土) 15:17:12.42ID:4R4YZGj/
rake routes忘れてました・・・。実行しました。

あと、indexの記述を頂いた↓にしました。
link_to 'copy, :action => :cppy, :id => :vegetable.id, :method => 'post'

エラーは、↓になりました。
ActiveRecord::RecordNotFound in VegetablesController#copy
Couldn't find Vegetable with ID=1989628

このIDはなんぞ?レコード数は、まだ15です。
01581432011/07/30(土) 15:20:40.70ID:???
教則本(Head First Rails)が2.3系だったので、VPSに入ってたのを
わざわざダウングレードして使ってるんです。rubyも1.8.7だし。
これから覚え始めるのなら3系の1.9が良かったのかも・・・。
01591432011/07/30(土) 16:30:59.00ID:4R4YZGj/
143です。いろいろ試したところ、
link_to 'copy', :action => :cppy, :id => :vegetable.id, :method => 'post'
を
link_to 'copy', :action => :copy, :id => vegetable.id, :method => 'post'
とvegetable.idの前の「:」を取ったらエラーがなくなりました。
が、複製は動きません。

indexの「copy」のリンクは下記が生成されています。
http://127.0.0.1:3000/vegetables/copy?id=10&method=post

コントローラは下記です。
[controller]
# POST /vegetables
# POST /vegetables.xml
def copy
@vegetable_g = Vegetable.find(params[:id])
@vegetable = Vegetable.new(params[:vegetable_g])

respond_to do |format|
format.html { redirect_to(vegetables_url, :notice => '青果見積の複製が完了しました') }
format.xml { head :ok }
end
end
0160nobodyさん2011/07/30(土) 16:51:22.80ID:jkxkSy7w
# :vegetable は typo でした。

rake routes は実行すること自体にdb:migrateのように意味があるわけではないので、
出力に意図する規則が定義されているかを確認したのでなければやった意味がない。
vegetables/copy という規則はあるのかな?

01611432011/07/30(土) 17:28:27.49ID:4R4YZGj/
出力の規則の定義ですか?

indexに足された1レコードが増えて再レンダされればいいという感じで、
respond do でそのままindexを実行するように書いているつもりです。
(デフォルトのdef deleteのコピペですが)
01621432011/07/30(土) 17:44:47.80ID:???
つづけざますみません。
下記のようにしたら、空のレコードがinsertされるようになりました。
あと少しっぽいのですが・・・。
respond_to do |format|
if @vegetable.save
format.html { redirect_to(vegetables_url, :notice => '青果見積の複製が完了しました') }
format.xml { head :ok }
else
format.html { render :action => "index" }
format.xml { render :xml => @vegetable.errors, :status => :unprocessable_entity }
end
end
0163nobodyさん2011/07/30(土) 18:38:07.83ID:jkxkSy7w
params[:id] が取れさえすれば、対応するレコードをDBから引っ張ってきて、
同じ情報でnewして保存するだけだよね?

0164nobodyさん2011/07/31(日) 17:33:31.50ID:hcUrE+vc
Code review: Ruby and Rails idioms ? giant robots smashing into other giant robots 
http://robots.thoughtbot.com/post/8135270582/code-review-ruby-and-rails-idioms
0165nobodyさん2011/07/31(日) 19:05:07.22ID:hcUrE+vc
Twitter: From Ruby on Rails to the JVM
http://ontwik.com/rails/oreilly-oscon-java-2011-raffi-krikorian-twitter-from-ruby-on-rails-to-the-jvm/

Odeo内で始めた小さなプロジェクトが「Twitter」だ。
Ruby on Railsを使って2週間で最初の動くバージョンを作り上げたという。
http://www.atmarkit.co.jp/news/200711/16/twitter.html

0166nobodyさん2011/07/31(日) 23:53:14.26ID:jRRlvPfa
プログラム板から移動してきました。

Railsで複数のデータベースに接続するときはどうすればいいのでしょうか?

ただし、条件として、
1.AのデータベースもBのデータベースもスキーマは一緒。だからクラスも同一のものを使う。
2.データベースサーバーの数は可変。エンドユーザーの操作で増えたり減ったりする。
3.複数のデータベースへは同時に接続します。つまり現在のリクエストで一つのデータベースにしか
接続しないということではなく、一つのリクエスト内で複数のデータベースに接続します。

のが前提です。

やりたいことは、あるデータベースに入っているデータを
他のデータベースに移すような処理と考えてください。
0167nobodyさん2011/08/01(月) 00:23:29.68ID:???
世間的にはoctopusが人気。
http://ruby-toolbox.com/categories/activerecord_sharding.html
↑に載ってないのだとmulti_dbというのもある。
https://github.com/schoefmax/multi_db

それぞれ癖があるので使えそうなのを使ってくれ。
なお、本番にいきなり適用すると危ないので
テストを十分に行ってから。
0168nobodyさん2011/08/01(月) 00:40:35.36ID:???
>>167
やっぱりコアではない他の何かを使うことになるんですね。

しかし、なんで複数のデータベースを同時に使うような
設計になってないのでしょうか?

これ、Railsだけじゃなくて他のフレームワークも同じ気がします。
(たしかCakePHPやPerlのCatalystも同じような設計だった)

モデルの共通情報(実質グローバル変数)としてコネクションがモデルと一体化されており、
たしかにモデルを使う分にはコネクションを指定せずに楽かもしれないですが
そのせいで複数のデータベースを同時に使えない。そのような設計にしか見えないです。

データベース接続とモデルは分離するのが正しい設計だと思うのですが・・・
この設計に問題があると言ってる人はいないんでしょうか?
そういう人の話を聞いてみたいです。
0169nobodyさん2011/08/01(月) 00:46:56.09ID:???
うーん。octopusって先にymlに使用するデータベースを
複数定義しておくものなのかなぁ?

> 2.データベースサーバーの数は可変。エンドユーザーの操作で増えたり減ったりする。
があるから、それができないんだよね。

もしかしたら別にやり方ある?
まあもうちょっと調べてみるけど。
0170nobodyさん2011/08/01(月) 01:42:47.30ID:???
Django最強
0171nobodyさん2011/08/01(月) 02:09:59.78ID:???
>>168
RailsのActiveRecordはその名の通りActiveRecordパターンなので、
データベース接続とモデルを一体化させることでシンプルにORMを実現している。
いうなれば世のウェブアプリの95%のケースを簡単にするために5%は切り捨てているわけ。
トレードオフの問題だよ。


正しいかどうかで言えば、「データベースサーバーの数は可変。エンドユーザーの操作で増えたり減ったりする。」という設計は正しいの?
0172nobodyさん2011/08/01(月) 03:54:32.50ID:alQ6X3qm
Commit History for rails/rails - GitHub
https://github.com/rails/rails/commits/master
0173nobodyさん2011/08/01(月) 08:15:04.01ID:???
ActiveRecordでその要件を満たすちょうどいいプラグインとか、定石はちょっと思い付かないな。
コネクションを都度切り替えるとか、DB分だけ大元のクラスを継承してそれぞれ別DBを指すようにするとか、泥臭いやり方ならいくつかあると思う。
二層コミットなんて期待できないから大変だと思うが。

まぁ、他のやつらもいってる通り、その設計はそもそも正しいのか。その設計がなんのために必要なのかが気になる。
0174nobodyさん2011/08/01(月) 08:21:04.77ID:???
負荷分散のためにマスターDBを複数に分散。ユーザIDによって接続先が変わる。
これが簡単にできればいいんだけどね。

どの有名フレームワークにもデフォルトではこんな機能は付いてないから
役立たずなプラグインに頼るか自前で強引にねじ込むしかないんだよね。

当然、Railsではエレガントに実装することが出来るんでしょ??
0175nobodyさん2011/08/01(月) 08:24:35.90ID:???
データベースを手動で移す処理が必要ってRDBMS使ってる意味ないよな
0176nobodyさん2011/08/01(月) 08:32:05.96ID:???
ユーザ系DBが複数に分散している場合、たとえばドラコレのガッツ組み手を考えてみよう。
ガッツ組みてでは自分のポイントを減算することと相手のポイントを増加させる処理が必要になる。

参照先DBが一つであれば単純にトランザクションを使えばいいが、ユーザーのIDによっては
接続先が二つに分かれる場合もある。

こういう処理をRailsでエレガントに処理できるんですか。
0177nobodyさん2011/08/01(月) 08:44:08.46ID:???
> ユーザ系DBが複数に分散

まずこの設計がエレガントではないのでどんなフレームワークを使おうがエレガントになりませんw
0178nobodyさん2011/08/01(月) 08:51:09.82ID:???
複数DBを同一モデルに適用して同時に使おうと考える時点で分散トランザクションが必須にならないか?
0179nobodyさん2011/08/01(月) 19:55:08.50ID:alQ6X3qm
はてなブックマーク - スケールアウトからスケールアップへの回帰:江島健太郎 / Kenn’s Clairvoyance - CNET Japan
http://b.hatena.ne.jp/entry/japan.cnet.com/blog/kenn/2010/01/12/entry_27036420/

はてなブックマーク - ウェブアプリケーションサーバを複数台構成とか2010年代には流行らない - kazuhoのメモ置き場
http://b.hatena.ne.jp/entry/d.hatena.ne.jp/kazuhooku/20091226/1261838127

ベニヤ板から見たスケールアウトの方向性 - ITレガシー
http://blog.goo.ne.jp/hsato/e/fadb6c13b2274e5194129f85093dfbbb
http://www.atmarkit.co.jp/news/201007/21/pixiv.html

第2回 Hadoopがスケール・アウトする仕組み | Think IT
http://thinkit.co.jp/story/2010/06/11/1608?page=0,2
0180nobodyさん2011/08/01(月) 21:02:10.90ID:alQ6X3qm
なぜTwitterは低遅延のままスケールできたのか 秒間120万つぶやきを処理、Twitterシステムの“今” − @IT
http://www.atmarkit.co.jp/news/201004/19/twitter.html

RORのままアーキテクチャの変更で10000%高速化したとな。
ttp://b.hatena.ne.jp/entry/highscalability.com/scaling-twitter-making-twitter-10000-percent-faster

ミニブログの Twitterのstats(統計)データ。
http://kaworu.jpn.org/kaworu/2008-01-16-2.php
- 350,000を超えるユーザ。
- 秒間600リクエスト
- 平均毎秒200-300コネクション。最大時は秒間800コネクション
- MySQLは秒間2,400リクエストを処理する
- 180のRailsインスタンスがある。MongrelのWebサーバを使っている。
- 1つのMySQLサーバ(1つの大きな 8コアのサーバ)と1つのスレーブ。スレーブは、統計とレポートのための読み込み専用(リードオンリー)。
- 雑用処理をするための30+のプロセス
- 8台のSun X4100s
- Railsでのリクエストの処理時間は200 msec
- データベースにかかる時間の平均は、50-100 msec
- 16GBの memcached
0181nobodyさん2011/08/01(月) 21:40:42.30ID:???
そもそも、業務系の要件を持ってるのかソーシャル系の要件を持ってるかもはっきりしないのにこんなリンクを得意気に貼るなんてミスリードでしかない。
0182nobodyさん2011/08/01(月) 21:58:02.42ID:alQ6X3qm
ActiveRecord Sharding
シャーディング
http://ruby-toolbox.com/categories/activerecord_sharding.html

https://github.com/masarakki/acts_as_multi_connection

DBを簡易シャーディングするacts_as_multi_connection
http://emasaka.blog65.fc2.com/blog-entry-798.html
0183nobodyさん2011/08/01(月) 22:03:03.94ID:alQ6X3qm
http://www.infoq.com/jp/news/2010/10/MongoDB-1.6
MongoDB 1.6はシャーディングや障害発生時に自動的にデータベースの切り替えや復元を行うレプリカセットの追加により、スケールアウト問題を解決する。

MongoDB 1.6はすでにbit.lyやfoursquareによってプロダクトの中で使われている。bit.lyはピーク時には1000台のサーバを並列化して、およそ5000万人のユーザを支えている。また、Foursquareは数百万のユーザー
0184nobodyさん2011/08/01(月) 22:05:01.60ID:alQ6X3qm
濃縮還元オレンジニュース:Twitter,分散フレームワーク「Gizzard」を公開|gihyo.jp … 技術評論社
http://gihyo.jp/dev/clip/01/orangenews/vol57/0002

https://github.com/twitter/gizzard
0185nobodyさん2011/08/02(火) 00:33:06.40ID:???
>>177
> まずこの設計がエレガントではないのでどんなフレームワークを使おうがエレガントになりませんw

データベースが複数ってそんなに変?

アカウントごとにデータベースを分けるって
普通にやると思うんだけど?
0186nobodyさん2011/08/02(火) 01:14:42.67ID:???
>>177
藻前のような奴を井の中の蛙と言うんだな(藁

大量アクセス高負荷サイトならユーザ系DBを水平分割するのは当たり前なんだよ。
マジでこのスレはレベル低いな。

マジでワロタ(ゲラゲラ
0187nobodyさん2011/08/02(火) 08:07:38.57ID:???
アカウント毎にDB分けるのと、ユーザーデータの水平分割はそれぞれやり方が違う気がする。

アカウント毎の場合はクッキーとか見てリクエスト毎に接続先のDB切り替えでいいと思う。
ユーザーデータの水平分割のやり方は知らんが、これもユーザーIDで接続先切り替えだろ。

どちらも問題は一リクエストで複数のDBを扱うときのトランザクションだけど、俺は極力トランザクションが不要な設計にして、問題が起きた時にログから復旧できるようにしたらいいと思う。分散トランザクションのよい解決法を知らんだけだけど。
0188nobodyさん2011/08/02(火) 08:18:27.46ID:???
どっちにしろフレームワーク使うようなものではない

> 大量アクセス高負荷サイトならユーザ系DBを水平分割するのは当たり前なんだよ。
そもそもruby使わないほうがいいんじゃね
01891432011/08/02(火) 09:21:51.95ID:gvG35C3d
>>163
> params[:id] が取れさえすれば、対応するレコードをDBから引っ張ってきて、
> 同じ情報でnewして保存するだけだよね?
そうだと思うのですが、どうしても空のレコードになってしまいます。
コントローラの記述は下記です。

どこがおかしいのでしょうか?

# POST /vegetables
# POST /vegetables.xml
def copy
@vegetable = Vegetable.find(params[:id])
@vegetable = Vegetable.new(params[:vegetable])

respond_to do |format|
if @vegetable.save
format.html { redirect_to(vegetables_url, :notice => '青果見積の複製が完了しました') }
format.xml { head :ok }
else
format.html { render :action => "index" }
format.xml { render :xml => @vegetable.errors, :status => :unprocessable_entity }
end
end
end
01901432011/08/02(火) 10:04:28.60ID:gvG35C3d
補足です。
respond_to doを下記にしたら品目名が取れましたので、findは成功しているようです。
あとはそのままnewしてくれるだけでいいのですが。

format.html { redirect_to(vegetables_url, :notice => @vegetable.hinmoku ) }
format.xml { head :ok }
01911432011/08/02(火) 10:44:58.57ID:gvG35C3d
def copy
@vegetable_g = Vegetable.find(params[:id])
@vegetable_h = Vegetable.new(params[:@vegetable_g])

respond_to do |format|
if @vegetable_h.save

やはり、@vegetable_h = Vegetable.new(params[:@vegetable_g])にパラメータが入らないのが原因のようです。
いろいろ試しているのですが・・・・。
01921432011/08/02(火) 13:03:14.45ID:gvG35C3d
自己解決しました。
下記のようにべた書きしたらコピーできました。
こんな書き方しなければいけないということはないと思うのですが・・・。

@vegetable = Vegetable.new(:kaikyu => @vegetable_g.kaikyu, :comment => @vegetable_g.comment,・・・
0193nobodyさん2011/08/02(火) 16:30:02.63ID:???
> @vegetable = Vegetable.find(params[:id])
> @vegetable = Vegetable.new(params[:vegetable])

何がやりたいの?
0194nobodyさん2011/08/02(火) 16:32:58.70ID:???
>>191
@vegetable = @vegetable_g.dup

じゃだめなの?
0195Perl忍者2011/08/02(火) 16:34:53.00ID:???
鼻でかブサイクが質問してるスレはここですか
笑えますね
01961432011/08/02(火) 17:46:04.37ID:gvG35C3d
>>193
目的はレコードの複製です。
idでfindして得た項目をnewで作りたいです。

>>194
@vegetable_g = Vegetable.find(params[:id])
@vegetable = @vegetable_g.dup

respond_to do |format|
if @vegetable.save
としてみましたが、複製されずにindexに戻りました。。。。
0197nobodyさん2011/08/02(火) 19:01:04.94ID:???
データのコピーをしたい、という要望は結構あるね
自分が実際に使ったのは以下みたいなコード

@user_org = User.where(:id => params[:id]).first
@user = User.new
@user.attributes = @user_org.attributes
@user.name = "コピー" + @user.name
@user.save
0198nobodyさん2011/08/02(火) 20:24:15.90ID:BAAVgQKN
RubyからScalaやJavaへの移行について、Twitterのエンジニアが語る - teppei studio 
http://d.hatena.ne.jp/teppei-studio/20110709/1310168002

http://readwriteweb.com/cloud/2011/01/how-twitter-uses-nosql.php
0199nobodyさん2011/08/02(火) 21:55:37.24ID:???
>>196
params[:vegetable]は何?
0200nobodyさん2011/08/02(火) 22:24:58.27ID:???
>>199
たぶん、Ruby の基礎も何もわかってないんだろう
0201nobodyさん2011/08/04(木) 00:22:23.02ID:pv4SsPe4
Pluginが広げるRailsの魅力 ? SlideShare (share powerpoint presentations online, slideshows, slide shows, ...
http://www.slideshare.net/dara/pluginrails

http://github.com/flyerhzm/rails_best_practices
http://github.com/pilu/web-app-theme
http://github.com/drnic/install_theme

http://railroad.rubyforge.org/
http://rails-erd.rubyforge.org/

Rails 2.3のApplication Templateで煩わしい初期設定とはおさらばする! - func09
http://www.func09.com/wordpress/archives/426

「RailsWizard」を使って最速で開発を始めましょう - Back yard : yuya_lush’s report
http://d.hatena.ne.jp/yuya_lush/20110707/1310021773
■ このスレッドは過去ログ倉庫に格納されています