【问题标题】:Rails joining ActiveRecord relationsRails 加入 ActiveRecord 关系
【发布时间】: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


【解决方案1】:

将名为organization_id 的列添加到users 表中。

将名为organization_id 的列添加到addresses 表中。

如下配置模型

// app/models/address.rb
class Address < ApplicationRecord
  belongs_to :organization
end

// app/models/user.rb
class User < ApplicationRecord
  belongs_to :organization
end

// app/models/organization.rb
class Organization < ApplicationRecord
  has_many :users
end

那么你的代码将归结为这个

addresses = Address.where("lower(state) LIKE ? AND lower(city) LIKE ?", state.downcase, city.downcase)

address_array = Array.new()
addresses.each do |address|
  address.organization.users.each do |user|
    address_array.push([ address, user.first_name, user.last_name ])
  end
end

如果您有任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多