【Ruby】Ruby on Rails Part6
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
2008/10/24(金) 17:46:53ID:???http://pc11.2ch.net/test/read.cgi/php/1207425569/
■参考サイト
<英語>
本家:http://www.rubyonrails.org
API document:http://api.rubyonrails.com/
開発者のblog:http://weblog.rubyonrails.org/
参考wiki:http://wiki.rubyonrails.org/rails
<日本語>
Rails' wiki: http://wiki.fdiary.net/rails/
■参考スレ
Rubyについて Part 33
http://pc11.2ch.net/test/read.cgi/tech/1223709050/
Ruby 初心者スレッド Part 22
http://pc11.2ch.net/test/read.cgi/tech/1221467121/
0951nobodyさん
2009/04/18(土) 01:28:25ID:???generateで作るやつがあるが、後者は2系でも普通にある。こっちはRESTful
なリソースを公開しようとすると、なんだかんだ言って基本的な骨組みは
scaffoldのものが使えたりする。
0952934
2009/04/19(日) 20:26:48ID:GcnrJHDf0953nobodyさん
2009/04/19(日) 21:43:31ID:???map.connect ':controller/:id/bbb/ccc', :action => 'bbb_ccc'
0954nobodyさん
2009/04/19(日) 21:44:38ID:???map.connect 'aaa/:id/bbb/ccc', :controller => 'aaa', :action => 'bbb_ccc'
のほうがいいか。
0955952
2009/04/20(月) 01:59:43ID:PwSyAV4m0956nobodyさん
2009/04/20(月) 10:04:09ID:???あるページにジャンプする際に、非ログイン状態だと403を返すようにしたいのですが、
これはどこにコードを記述するべきでしょうか?
0957nobodyさん
2009/04/20(月) 14:25:50ID:???restful authenticationつかってない?
0958nobodyさん
2009/04/24(金) 20:51:26ID:/YVXcJLc(User.find 133).friends(:all, :conditions => ["age = ?", 20])
こんな感じのことをしたいのですが、どうすればいいでしょうか。
(.friendsでは配列が返ってくる・・)
なんかうまい書き方があったら教えていただけると幸いです><
0959nobodyさん
2009/04/24(金) 21:08:16ID:???0960nobodyさん
2009/04/24(金) 21:37:48ID:???class Friend < AR::Base
named_scope :of_age, lambda {|age| { :conditions => [ 'age = ?', age ] } }
end
User.find(1333).friends.of_age(20)
0961nobodyさん
2009/04/24(金) 22:21:15ID:???:conditions に ハッシュを渡せば 各キーが AND で結合されますが、
product = Product.find(:all,
:conditions => {
:price => 1000,
:kubun => [6, 7, 8]}
)
select * from products where price = 1000 and kubun in (6, 7, 8)
key > value とかはできまませんか?
以下のような(在庫数が 10 以上 20 以下)SQL を実行させる Ruby コードを書きたいです。
10..20 として between を使いたいところですが、画面側で 10以上 だけしか指定されない場合があるため、使えません。
select * from products where price = 1000 and kubun in (6, 7, 8) and zaiko > 10 and zaiko < 20
0962nobodyさん
2009/04/24(金) 22:38:10ID:???args = [ 1000, [6,7,8, 10] ]
if upper
conditions += ' AND zaiko < ?'
args << upper
end
find(:all, :conditions => [ conditions, *args ])
0963nobodyさん
2009/04/24(金) 22:38:51ID:???0964nobodyさん
2009/04/24(金) 22:55:22ID:???やはり :conditions にハッシュを渡す方法じゃなく、
:conditoins => 配列 のやり方
(配列の第一要素が SQL の文字列、第二要素以降がバインド変数のパラメータ)
じゃないとできないですか。
その方法でやってみます。
0965nobodyさん
2009/04/24(金) 23:32:47ID:???:conditions => [ 'price = :p', { :p => 1000 } ] とも書けるな。
0966nobodyさん
2009/04/25(土) 00:01:47ID:???その15コがそのまま SQL のパラメータになるんだけど、session オブジェクトをそのまま ActiveRecord のモデルのメソッドに
渡してもよい?
それとも何か Condition クラスを作り、そこに詰めてからモデルに渡すべき?
Java 的発想だと、Http 層を 永続化層に持って行くのはよくないので、なんらかのオブジェクトに詰め直してから
渡しますが、Rails でもそうしたほうがいいでしょうか。
session はハッシュなので、そのハッシュから部分的なハッシュを作り直し、ハッシュ渡しにしようかと思いましたが、
入力項目が多いので、抜けがあると間違いの元なので、単独の Condition クラスを定義しようと思っています。
0967nobodyさん
2009/04/25(土) 07:37:56ID:???最初からConditionオブジェクトに詰めて永続化しておき、Sessionでは
参照キーだけを持っておくという形にする気がする。
0968nobodyさん
2009/04/25(土) 13:09:16ID:???Railsでは詰めなおしてもあまり意味ないかも。
入力項目のチェックはActiveRecordがするんだし。
0969nobodyさん
2009/04/25(土) 13:27:35ID:???標準のrspecとmock、stubとどう違ってくるんでしょ
0970nobodyさん
2009/04/25(土) 16:44:24ID:???テーブルとモデルを1:1で紐づけるのがactive recordパターン
テーブルとモデルをn:nで紐づけるのがdata mapperパターン
Webはフォームの入力項目 ≒ テーブルなのでactive recordパターンが広く使われている
なので、sessionでもつハッシュの構造はDBにあわせた方がベター
それができない場合は、モデルにハッシュ構造の変換処理を書くのが作法
ARにもバリューオブジェクトあるけど、ちょっと用途が違う気がする
0971nobodyさん
2009/04/25(土) 23:25:28ID:???凝った検証処理が必要ないなら Hash#assert_valid_keys でチェックしてから Hash#slice で切り出して渡すかな。
0972nobodyさん
2009/04/26(日) 05:03:44ID:???アップロードした画像をリサイズしてくれたり、ファイル一覧をサムネイルで表示してくれたり、
選んだの削除できたり
そういうステキなのキボン
0973nobodyさん
2009/04/26(日) 14:44:10ID:ZTlDJFDt作ってくだ(ry
0974966
2009/04/26(日) 18:58:31ID:???結論としては、session オブジェクトをモデルのメソッドに渡すのをやめ、
新規に condition オブジェクトを作ることにしました。
>>970
今回のケースでは、
画面の入力項目はそのまま SQL のパラメータになるけど、モデル(テーブル)の属性にはならないのです。
>>961 (これも自分なのだが) のように、商品マスタの price が ○円以上○円以下で、kubun が■or■で・・・・といった条件が延々と並ぶ。
だからモデルクラスはそのまま使えませんでした。
>>971
ruby リファレンスマニュアルの hash をみたところ、assert_valid_keys や slice というメソッドはありませんでした。
これは自分で特異メソッドとして定義せよ、ということ?
0975nobodyさん
2009/04/26(日) 19:04:34ID:???http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html#M001164
0976nobodyさん
2009/04/27(月) 16:33:28ID:ty2d5Btl>>960
ありがとうございますm(_ _)m
すいません他にも質問したいことができました。
if true
User.friends
elseif
User.parents
else
User.childern
end
のような処理をしたいとき、
User.xxx のxxxの部分を変数みたいにして、条件分岐なしで一行で書くことはできないでしょうか??
ご教示いただけると幸いです。
0977nobodyさん
2009/04/27(月) 20:17:33ID:ty2d5Btlif x='friends'
User.friends
elseif x='pearents'
User.parents
else x='children'
User.childern
end
を一行で書けないか・・みたいな感じです。
0978nobodyさん
2009/04/27(月) 20:24:34ID:???0979nobodyさん
2009/04/27(月) 20:26:28ID:???User.method(x).call
0980nobodyさん
2009/04/28(火) 00:13:18ID:???現在、items(仮)というテーブル(id, name)からnameを条件にレコードを検索し、
will_paginateを使用して表示している機能があります。
その機能を、検索条件との「完全一致」「前方一致」「部分一致」の順に並び替えたいのですが、
なにかいい方法はないでしょうか…?
複雑なSQLを書けばいけるとは思いますが、何か他に方法がないか模索してします。
0981nobodyさん
2009/04/28(火) 01:29:09ID:???Item.find_by_sql <<SQL
SELECT * FROM (
SELECT 1 AS sort_key, * FROM items WHERE name LIKE "aaa"
UNION SELECT 2 AS sort_key, * FROM items WHERE name LIKE "a%"
UNION SELECT 3 AS sort_key, * FROM items WHERE name LIKE "%a%") ORDER BY sort_key ASC
SQL
とか。(てきとう)
トータルの該当検索件数が大したことないなら、
それぞれの一致方式で個別にfindした結果を連結し、そいつに、
will_paginateが必要とするメソッドを特異メソッドとして実装するという手もある。
(total_pages, current_page, previous_page, next_pageメソッドを定義すればいい)
あと、likeの引数に任意の外部入力文字列を安全に埋め込むのは結構面倒だと思うのでがんばって。
0982nobodyさん
2009/04/28(火) 03:22:51ID:???そのままだとaaaというnameを持つitemが3つのselectそれぞれから出てくるな。
要distinct?
0983nobodyさん
2009/04/28(火) 06:13:49ID:N2IsGKnPユーザ毎にカード型データベースを持たせたいと思っています。
自由にフィールド数を定義でき、入力フィールドも並び替えできるようにしたいと
思ってます(イメージ的には簡易的なデヂエみたいなの)
そこで質問ですが、ユーザ操作でtableを生成することはrails的作法で有りなのでしょうか?
ある程度入力値にルールを設けたいので、validateほにゃららを定義できれば..と
欲張っているんですが、modelに手をいれる必要がありますよね?
generatorとして作らないといけないのでしょうか?
0984nobodyさん
2009/04/28(火) 11:26:55ID:???1.ページごとのレコードをDBで絞り込んでRailsで表示させる
2.該当のレコードをすべて取得してRailsで表示させる
のどちらかだと思う
「1」はDB依存だからどのDBを使ってるかで答えは変わる
「2」は大量のレコードが返ってくるなら普通やらない
そもそも部分一致はインデックスを使えないから、
普通のRDBの使い方ではやるべきじゃないな。
全文検索機能を使ってるなら、また答えは変わる。
情報が不足しすぎて答えられないな
0985nobodyさん
2009/04/28(火) 21:47:12ID:???ユーザーのアカウントごとに構造の異なるARモデルを扱うアプリを運用しています。
テーブルスキーマ自体はいまのところユーザーの好き勝手ではなく、アカウント作成時に
カラムの型やオプションをYAMLファイルで定義したものを使っているので
>>983ほど柔軟ではないです。
AR::Base.connection.create_table {|t| ... } でそれらのカラム定義から t.column を呼び、
Class.new(AR::Base) して動的に作ったモデルクラスで set_table_nameすれば、ファイル
に書き出さずともモデルとして使用できます。
カラムの数や順序を自由に変更できるようにするには、ユーザーの変更操作に同期して
schema_statements.rbにあるメソッドを呼んで処理してやる必要があると思います。
0986nobodyさん
2009/04/29(水) 01:18:41ID:MR+/ICUP世界に羽ばたく
Ruby on Railsオフショアアジャイル開発
http://www.tech-arts.co.jp/news-and-topics/press-releases/20090427.html
0987nobodyさん
2009/04/29(水) 01:23:54ID:???しかもこれからってw
圧力釜もろくに作れない国に発注するって顧客に対する背信行為だと思う。
メーカーなみに製造管理するならいいけど、
工場ほど単純作業じゃないから無理だわな。
0988nobodyさん
2009/04/29(水) 01:34:38ID:???で、コストの高い日本の不勉強さん使うよりオフショアの方が質がいい。そんな感じだろーね。
けど、実際は難しいけど。上手くいかせたくない心理が働いてそう。
0989nobodyさん
2009/04/29(水) 01:48:39ID:???失敗すれば全部かぶるんだよ。幻想はおまえだ
0990nobodyさん
2009/04/29(水) 10:49:26ID:???きてるのかね。
個人的には、中国とかインドの新興国はJavaばっかりやってるイメージ
があるが。
0991980
2009/04/29(水) 11:25:21ID:???回答ありがとうございました。
>>981さんの方法が、自分でもわかりやすいかなという感じです。
>>982
まったくそのとおりで、要distinctです。
重複を省くための条件が長くなってしまうので、この方法でやるか悩んでいます。
>>984
実際には食品をDB(mysql5)から検索するシステムです。
DBに「牛乳」「牛乳(低脂肪)」「牛乳(濃厚)」「加工牛乳」というレコードがあった場合、
「牛乳」という検索ワードで上記4レコードは表示する必要があります。
なので、
select * from items where name like '%検索文字列%'
でも必要な情報は取れるのですが、完全一致したものは上に表示したいという
気持ちもあります。
ていうかlikeの部分一致ってINDEX使わないんですね・・・。
0992nobodyさん
2009/04/29(水) 11:57:35ID:???0993nobodyさん
2009/04/29(水) 14:00:00ID:???なるほど。likeの部分一致の遅さを許容できるならやり方はあるよ。
3回SQLを打つのは速度や負荷を考えるとやらない方がいいと思う。
すでに話題になってるように重複の問題もあるし。
やり方の一つとしては「ソートキーを作る」。
MySQLはほとんどやらないし、いま手元に環境はないから検証できないのだが、
case文はサポートされていたと思う。
select column_1, columnt_2, column_3,
case
when name = '牛乳' then 0
else 1
end match
from items
where name like '%牛乳%'
order by match, sort_key
などとやれば完全一致したものは「match」列に「0」が、そうでないものは「1」が返るはず。
これを第1ソートキーにすればいい。
部分一致や後方一致もちょっと調べたところ、
文字列比較関数なるものをを使えばできるんじゃないだろうか。
優先させたい条件順に番号をふればきれいに並ぶと思う。
これはSQLネタのように思うので、
これ以上知りたければSQLスレがいいだろう。
あるのか知らないけど。
あともし解決したら、差し支えない範囲で解決策をレスしてほしい。
ほかの人が参考にできるから。
聞いてわかってさよならが多くなってるからね。
0994nobodyさん
2009/04/29(水) 21:57:49ID:???ありがとうございます。
なるほど・・・。その方法はいいですね。
>あともし解決したら、差し支えない範囲で解決策をレスしてほしい。
了解です。該当機能が動くようになった時にでも。
0995981
2009/04/29(水) 23:40:19ID:???結論から言えば、sqlで解決しました。以下バージョン等・・・
Rails2.3.2
will_paginateは確か2.2.2か2.0.2だったような・・・。今日現在の「最新」です。
dbはmysql5.0.67
なおwill_paginateの文献をググると、paginate_by_sqlメソッドを自前で追加する
tipが良く見つかりましたが、最新ではソース追加なしでpaginate_by_sqlが使えました。
■牛乳の例でのsql分
select
*,
(
case
when name = '牛乳' then 0
else
case
when name like '牛乳%' then 1
else 2
end
end
) as sort_key
from
items
where
name like '%牛乳%'
0996981続き
2009/04/29(水) 23:45:05ID:???ほとんどないので、コレで意向と思います。
ソースは変えてありますが、下のような感じで対応しました。
#コントローラ
def コントローラのメソッド
search = params[:search] #検索画面から検索文字列を取得
sql = "select *,(case when name = \'#{search}\' then 0 else case when name like '\'#{search}\'%' then 1 else 2 end end) as sort_key from items where name like \'%#{search}\'%
@results = Item.paginate_by_sql(sql, :page => params[:page], :per_page => 30)
end
#ビュー
<% @results.each{|item| %>
<%= item.name %><br>
<% end %>
>>981,982,984,993
答えてくださった方、ありがとうございました。
0997981続き
2009/04/29(水) 23:53:52ID:???動いてるソースから書き換えたのでいろいろ間違えてます・・・><
order byがないと修正した意味ないっス〜・・・。そのあたりは流れから脳内変換してください><
すみません、スレ汚し失礼しました。
0998nobodyさん
2009/04/30(木) 00:17:59ID:???フィードバックありがとう。強要してすまんね。
paginate_by_sqlは知らなかったから参考になった。
0999nobodyさん
2009/04/30(木) 23:12:06ID:???【Ruby】Ruby on Rails Part7
http://pc11.2ch.net/test/read.cgi/php/1241100447/
1000nobodyさん
2009/04/30(木) 23:18:02ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。