2010-12-31 7 views
0

私は何年もシェルスクリプティングをやっていた初心者のプログラマーですが、最近はRubyを使ったOOPプログラミングに取り組み、Railsアプリケーションを作成しています。Usng Rails ActiveRecordの関係

私は定義されたモデル関係をどのように使用するかについて頭を悩ませています。

私はGoogleを検索しようとしましたが、私が思いつくことができるのは、基本的にはhas_many、belongs_toなどの意味のカンニングシートです。 このようなことは、特に私がSQLで直接多くの作業を行ってきたので、わかりやすいように&を理解しています。

私が理解していないのは、定義された関係をどのように実際に使用するかです。

私の場合は

私は3つのモデルがあります: 場所 ホスト サービス

関係(実際のないコード、それを短縮するための):私のことができるようにしたい。この場合

Services 
    belongs_to :hosts 

Hosts 
    has_many :services 
    belongs_to :locations 

Locations 
    has_many :hosts 

サービスで作業中に場所から列を表示します。 SQLではこれは単純な結合ですが、Rails/Rubyのやり方で行いたいし、コード内でSQLを使用したり、結合を再定義したりしたくない。

答えて

0

Locationsにhas_many throughを定義できます。

SELECT "services".* FROM "services" INNER JOIN "hosts" ON "services".host_id = "hosts".id WHERE (("hosts".location_id = 1)) 

...指定された場所のためのサービスのすべてを収集します:これは、このクエリを生成します

Location.first.services 

Locations 
    has_many :hosts 
    has_many :services, :through => :hosts 

Hosts 
    belongs_to :location 
    has_many :services 

Services 
    belongs_to :host 
    has_one :location, :through => :host #This relationship is optional 

次に、あなたがしてサービスにアクセスすることができ。

EDIT:他の人との関係を望んでいるとわかります。これを行うには、各サービスが1つのホストに属し、各ホストが1つの場所に属しているため、service.host.locationを実行してサービスからその場所にアクセスできます。上のオプションの関係を追加することもできるので、service.location.column_nameと入力するだけです。私はあなたがそう、あなたのモデルため単数形の名前を使用するのに慣れる必要があります知っているものについては

+0

さらに、セスは、適切に複数化される必要がある関係について正しいです。また、Locationのクエリはおそらく 'first'とは異なるでしょうが、それがどのように達成されるかを示す良い例です。 –

+0

参加テーブルが各所有サイドに属していないため、Has_many throughは機能しません。 – sethvargo

+0

該当しません。それは動作します。 SELECT "services"。* FROM "サービス" INNER JOIN "hosts" ON "services" .host_id = "hosts" .id WHERE( "" hosts ".location_id = 1)) –

0

:今の関係は、実際に意味をなす

 Service 
     belongs_to :host 

    Host 
     has_many :services 
     belongs_to :location 

    Location 
     has_many :hosts 

がお知らせ: ホストにhas_manyサービス、belongs_toのサービスホストと位置has_manyのホスト

今レールコンソール上で試してみてください。

service = Service.create(:name => 'ServiceName')#assuming you only have that field and the host_id of course 
service.host# right after creation will return an empty array...so create a host 
host = Host.create(:name => 'HostName')#assuming you only have that field and the id of course 
#if both were saved to db 
host.services << service 
#or 
service.host << host #should work for you 

service.host.name   
service.host.id # or any other column you have there