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,但似乎必须有更优雅的方法来执行此操作。 我在这里想念什么?
干杯。
答案 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)
。