Usng Rails ActiveRecord关系

时间:2010-12-31 22:53:39

标签: ruby-on-rails-3

我是一名新手程序员,多年来一直在做shell脚本,但最近使用Ruby进行了OOP编程,并创建了一个Rails应用程序。

我很难弄清楚如何使用我定义的模型关系。

我已经尝试过搜索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或重新定义我的连接。

2 个答案:

答案 0 :(得分:0)

你可以通过Locations定义一个has_many。

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

然后您可以通过以下方式访问服务:

Location.first.services

这将生成此查询:

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

...将收集给定地点的所有服务。

编辑:我意识到你想从另一端获得关系。为此,您可以通过执行service.host.location从服务访问该位置,因为每个服务属于一个主机,并且每个主机属于一个位置。您还可以添加上面的可选关系,因此您只需键入service.location.column_name。

答案 1 :(得分:0)

据我所知,您应该习惯使用模型的奇异名称,所以:

     Service
       belongs_to :host

     Host
       has_many :services
        belongs_to :location

    Location
      has_many :hosts

请注意,现在关系实际上是有意义的: 主机has_many serviceS,服务belongs_to主机,位置has_many主机

现在尝试使用rails控制台:

 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