在Active Records / Ruby on Rails中使用Retrieval Multiple Objects进行另一次检索

时间:2012-03-02 22:33:52

标签: ruby-on-rails ruby activerecord

Ruby / Rails的新功能,来自c / c ++,所以我正在做我的宝贝步骤。 我正在努力为以下问题找到最优雅的解决方案。 表A中包含表B的外键(我们称之为b_id),表B包含名称字段和主表(id)。

我希望从A获得一个对象列表,根据一些标准,使用此列表的b_id访问表B,并检索名称(名称字段)。

我一直在尝试许多失败的事情。我想我错过了一些基本的东西。 我试过了:

curr_users = A.Where(condition)
curr_names = B.where(id: curr_users.b_id) # fails

也尝试过:

curr_names = B.where(id: curr_users.all().b_id) # fails, doesn't recognize b_id

以下有效,但它只处理单个用户......

curr_names = B.where(id: curr_users.first().b_id) # ok

我可以迭代curr_users并构建一个外键数组并使用它们来访问B,但似乎必须有更优雅的方法来执行此操作。 我在这里想念什么?

干杯。

2 个答案:

答案 0 :(得分:1)

假设您有以下型号:

class Employee
  belongs_to :department
end

class Department
  has_many :employees
end

现在您可以根据某些员工过滤部门

# departments with employees from California
Department.include(:employees).where(:employees => {:state => "CA"}).pluck(:name)

答案 1 :(得分:0)

为简单起见,我们举一个文章和评论的例子,而不是A和B.

评论有一个指向文章的外键article_id,因此我们可以设置从文章到评论的has_many关系以及从评论到文章的belongs_to关系,如下所示:

class Article < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :article
end

一旦你有了这个,你就可以做<article>.comments,Rails会吐出一个包含该文章外键的所有评论数组。除非您尝试设置更复杂的查询(例如,在特定日期之前创建的所有注释),否则无需使用条件。

要获取所有评论标题(示例中的名称),您可以<article>.comments.map(&:title)