Rails' "has_many :through" 生成什么新方法?

What new method does Rails' "has_many :through" generate?

我正在建立房屋买卖模型之间的关联关系。 User会有多个Housing agencies和多个Houses,反之,House也会有多个Housing agencies和多个Users。具体型号如下: 模型用户

has_many :agencies
has_many :houses through: :agencies

模特经纪公司

belongs_to :user
belongs_to :house

样板房

has_many :agencies
has_many :users through: :agencies

我想知道,如果我想查询加入代理的用户,可以这样吗

House.where(id: 10).agency_users

也就是会生成agency_users方法吗?如果有,官方的教学文件写在哪里?如果不是,应该如何解决?

谢谢

首先,您的关联定义有误 - throughkeyword argument,因此您需要添加一个冒号:

has_many :houses through: :agencies

What new method does Rails' "has_many :through" generate?

它生成一大堆方法:

                                  |       |          | has_many
generated methods                 | habtm | has_many | :through
----------------------------------+-------+----------+----------
others                            |   X   |    X     |    X
others=(other,other,...)          |   X   |    X     |    X
other_ids                         |   X   |    X     |    X
other_ids=(id,id,...)             |   X   |    X     |    X
others<<                          |   X   |    X     |    X
# ...

我不知道你从哪里得到 agency_users 但它肯定不会从你问题中的任何代码生成,因为它基于名称参数(第一个)。

您还犯了 classic 菜鸟错误,并在 ActiveRecord 关联上调用关联方法。 where returns 多个记录,同时关联创建实例方法。使用 find(10)find_by(id: 10)(如果允许为 nil)。

If yes, where is the official teaching document written? If not, how should it be fixed?

我不确定您在这里实际问的是什么,或者“官方教学文件”应该是什么意思。 Rails 有两个 API documentation and guides.

如果您正在谈论记录您自己的代码,这取决于您使用的是 RDoc 还是 Yard。据我所知,两者都不会自动获取关联宏生成的方法,但您可以在 Yard 中手动执行:

# @!method foo

我不知道 RDoc 是否有类似的功能,所以您可以只在整体 class 描述中记录关联。

这些关联并不是你真正想要的

这里的主要问题是您将 house_id 放在代理商 table 上,这意味着它只能为每个代理商记录一个值!这对生意不利。

你真正想要的是更像

class Listing
  belongs_to :user
  belongs_to :agency
end

class Agency
  has_many :listings
  has_many :clients, 
    through: :listings,
    source: :user
end

class User
  has_many :listings
  has_many :agencies, 
    through: :listings
end

我通常会避免使用“房屋”一词,而使用可以涵盖许多不同类型房产的特定领域列表。