【发布时间】:2017-03-22 21:28:04
【问题描述】:
我的部分问题是知道如何描述我正在做的事情,所以请原谅这个潜在的闲聊:
好的,所以我需要找到一个地址列表,所以我有一个类似的关系查找:
addresses = Address.where("lower(state) LIKE ? AND lower(city) LIKE ?, state.downcase, city.downcase)
这很好用:我得到了所有地址的列表,其中城市和州是传入的值。接下来,我有一个 User,它有一个数组 address_ids,其中包含所有地址的所有 ID它与。我想找到在上述查询中找到任何一个 ID 的所有用户。首先,我创建了一个包含所有这些 ID 的数组:
id_array = Array.new()
addresses.each do |address|
id_array.push(address.id)
end
然后,我使用这个新数组并查找具有 address_ids 数组的用户,该数组包含任何一个 id_array 值。这是由以下人员完成的:
applicable_users = User.where('address_ids && ?', '{' + id_array.to_s + '}')
这也有效。现在我有一个符合一组标准的所有地址的列表,以及一个也符合该组标准的用户列表。 现在我想创建一个数组(这样我可以将其转换为 JSON,然后将其渲染),其中列出了每个地址和相应的用户。
我现在这样做的方法是循环遍历applicable_users,遍历他们的每个address_ids,找到我想要的address,然后将其推入一个新数组,a la:
address_array = Array.new()
applicable_users.each do |user|
user.address_ids.each do |address_id|
selected_address = addresses.find(address_id.to_i)
address_array.push([selected_address..., user.first_name, user.last_name])
end
end
长话短说:这现在有效,但感觉既脆弱又没必要。有没有办法加入这两个 ActiveRecord 关系,以便我可以跳过循环/恶作剧?
即使经过几个小时的研究,我还是有点不知道从哪里开始,所以非常感谢任何方向。
【问题讨论】:
-
您能否提供配置两个模型关系的代码:用户和地址?
-
@Hoa 目前没有。地址通过组织属于用户。但很难/不可能宣布这一点。所以用户有一个地址 ID 数组,但地址不一定属于任何用户。也许这就是我的主要问题所在?不知道如何称呼这种关系......
-
可以通过组织声明地址属于用户的关系。我可以帮你。我需要你描述你的数据的逻辑。例如:用户属于具有多个地址的组织。一旦我们正确配置了模型之间的关系,查询部分应该是直截了当的。
-
@Hoa 太棒了!那会清理干净。所以它的工作方式(并且,必须基于客户端)是一个组织:has_many 地址和:has_many 用户。地址 :belongs_to 一个组织。一个用户(An User?呵呵),也是 :belongs_to 组织。据我所知,用户可以 :has_many 地址,但地址并不真正 :belong_to 用户 - 它们只属于组织。
标签: join activerecord ruby-on-rails-5