Ruby - Datamapper - 通过连接两个模型来收集记录

时间:2012-12-01 01:31:40

标签: ruby datamapper ruby-datamapper

我有两张桌子

users
-------
id
name
organization_id


organizations
----------
id
org_name
org_unique_num
abc
xyz
users表中的

organization_id是组织表id的外键

class Organization
  include DataMapper::Resource
  property :id, Serial
  property :org_name, String
  property :org_unique_num, Integer
  property :abc String
  property :xyz String
  has n,    :users 
end

class User
  include DataMapper::Resource
  property :id, Serial
  property :name, String
  property :organization_id, Integer
  property :age, Integer
  belongs_to :organization 
end

我想通过加入用户年龄>的组织表来获取用户的记录。 25.所以结果看起来应该是

user_id    name    organization_id    org_name   org_unique_num    age
12         John       356              ATT           76763          38
35         Lisa       981              IBM            2376          28

那我怎么能做到这一点?请注意我不希望结果中有列abc和xyz。

User.all(:age.gt => 25) 

这只会给我年龄> 25的用户,但我也想抓住用户的组织信息。有可能做一个声明吗?或者必须分多步完成。就像收集所有user_id一样,然后传递给组织模型,在()中使用id,这将是丑陋的。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

DataMapper将为您完成所有加入工作。

您不需要为每个用户提取组织,这是自动完成的。

因此,您只需使用以下内容获取用户:User.all(:age.gt => 25)

每个用户都会将其组织附加到其中:

User.all(:age.gt => 25).each do |user|
  p user.name
  # organization not yet fetched, only referenced
  p user.organization
  # now organization are fetched
  p user.organization.id       # display org ID
  p user.organization.org_name # display org name
  # etc
end

注意“我不需要abcxyz”,如果它们是Text列,DataMapper会懒洋洋地加载它们,这意味着只有在通过{{ 1}}和user.abc