我是一名新手程序员,多年来一直在做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或重新定义我的连接。
答案 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