🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

1752閲覧

同一名moduleの分割もしくはmoduleファイルへのclassのincludeのようなことが可能ですか?

ambiguous

総合スコア33

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2019/12/18 14:22

異なるDB間の移行プログラムを検討中です。各DB Engineは異なりますが、全く同じではないものの同様の機能を提供するAPのバックエンドで動いていることもあり、同じ名称のテーブル名もいくつか存在します。

そこで参照側DBのテーブルに接続するmodelを、moduleを作成し内部にclassを列挙することを考えていますが、テーブル数が多く複数人/複数ファイルに分割することを検討しています。何分RoR初心者でして、どのような構成が望ましいのかが良く判りません。

(1)先ず同一名のmoduleを複数のファイルに分割することが可能なのか?(RoRでは、module名やclass名をファイル名にするようなので、これは不可なのでは?)

(2)moduleに他のmoduleをincludeすることで、他のmodule内に記述されたclassを自module内のclass同様に利用可能なのか?

(3)同様事例の場合、RoRにおいてmore better(勿論、bestがあればbestで)な方法は?

が、知りたいのです。

ネットでmoduleを調べても、あまりにも当然のことなのか、この辺りに触れている記事がなかなか無く(キーワードが悪い?)、有識者の皆さんに教示いただけたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

同じ名前のmoduleを複数のfileに分けて記述することは可能ですが、それらが全て有効になるようにするには、それらが書かれているfileをもれなく明示的にrequireさせる必要があり、rails的ではないです。

分担して作成するということでしたら、親moduleが子moduleをとり込むという様にするのが良いのではないでしょうか。

全てのmoduleが取り込まれれば他のmoduleで定義されたclassを使うことは出来ますが、classの呼び方に注意が要ります
ModuleP に取り込まれた ModuleA の ClassPA を ModlePに取り込まれたModuleBのClassPB から使うとき、
ClassPA を呼ぶと ModuleB::ClassPA が未定義 と多分言われます。
ModuleP::ModuleA::ClassPA(間違いかも) の様に呼ばないと。

追記
とするとこういうのかなぁ
ModuleAのfileの中で ModulePを追加定義して、その中でclassを定義する

*/*/module_a.rb module ModuleP::ModuleA end module ModuleP class ClassPA end end

これですと ModuleBをとり込むときに file modele_a.rbは読まれますので、追加定義が取り込まれます

追記2
ただ、私ですとこういうclassの定義はしません
rails g model ModuleP::ClassA
とすると
app/models/module_p.rb
app/models/module_p/class_a.rb
ができます。

# module_p.rb module ModuleP def self.table_name_prefix 'module_p_' end end # module_p/class_a.rb class ModuleP::ClassA < ActiveRecord::Base end

こういう形での記述をします
ActiveRecord::Base でなければ不要な宣言は消しますが。

投稿2019/12/20 04:38

編集2019/12/20 22:10
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ambiguous

2019/12/20 11:40 編集

なるほどmoduleを多段構成にすれば良いと言うことですね。またそれぞれのmoduleからは親moduleまで遡って指定する必要があると言うことですね。 でもmodule外から各classを呼ぶ場合もModuleP::ModuleA::ClassPAのように、moduleAに属しているのかmoduleBに属しているのかが判っていなければならないのではないでしょうか? できればclassPAもclassPBも、同じ修飾子で呼べるようにしたいです。
ambiguous

2019/12/20 14:45

追記いただいたような記述が出来るとは知りませんでした。この週末に回答いただいた内容でmoduleの関係を確認してみたいと思います。
ambiguous

2019/12/21 15:05 編集

両方法を比較しながら検討いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問