【问题标题】:Active Record querying relation to get other relationActive Record 查询关系以获取其他关系
【发布时间】:2015-01-10 17:02:59
【问题描述】:

我希望能够通过调用不同模型对象的另一个关系上的方法来返回 AR 关系。换句话说,给定一个User 模型,其中belongs_to 一个House 模型(has_onehas_many 用户)我希望能够获取users 的关系并执行users.houses,它应该返回这些用户所属的房屋对象的关系。

注意 -- 我不是想创建一个user.houses 方法(单一用户),而是一个users.houses 方法,它获取所有id 都在所有列表中的房屋house_ids 在users 的列表中。这个想法是,这允许我在房屋关系上调用类/关系方法:users.houses.house_class_method

我尝试过“手动”执行此操作:

class User
  belongs_to :house

  # Is there some AR Relationship I can declare that would
  # write this method (correctly) for me?
  def self.houses 
    House.where(id: pluck(:house_id))
  end
end

房屋模型:

class House

  has_many :users

  def self.addresses
   map(&:address) 
  end

  def address
    "#{street_address}, #{city}"
  end
end

不过有两个问题:

  1. 这感觉(可能是错误的)应该是 可通过 AR 关系声明。

  2. 它无法正常工作。麻烦(如this separate question 中所述)是users.houses 工作正常,但是当我 做users.houses.addresses, 该方法是在 House 类上调用的,而不是在关系上调用 users.houses 返回的房屋(!?!)。结果,我收到了 undefined method 'map' for <Class:0x1232132131> 错误。

在 Rails 中是否有正确的方法来做到这一点——本质上说关系属于另一个关系,或者模型属于另一个关系级别的关系?

谢谢!

【问题讨论】:

  • 您想要所有拥有用户的房屋?是否必须从用户那里调用?或者可以在House上做一个范围?还是您想要一个属于用户列表的房屋列表?
  • 最后一个。属于用户列表的房屋列表。我在上面给出了我的示例版本,但是当我链接方法时它不起作用,即list_of_houses_from_list_of_users.array_method 中断。有关更多详细信息,请查看我链接到的另一个问题。
  • 你的房子模型是什么样的。我对你说房子有 has_one 或 has_many 用户感到困惑
  • 这是一个假设模型,代表我的应用程序中不太直观的建模。我将在上面举一个例子。在我的应用中,第二个模型(此处为 Househas_many

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord


【解决方案1】:

UserHouse 模型之间实现has_and_belongs_to_many 关系可能会更容易实现您想要的。

class User
  has_and_belongs_to_many :houses
  ...
end

class House
  has_and_belongs_to_many :users
  ...
end

> user = User.find(user_id)
> user.houses # All houses the user  belongs to
> house = House.find(house_id)
> house.users # All users belonging to the house

【讨论】:

  • 谢谢。但是我在获取单个对象的关联时没有问题。我正在尝试获得完整 AR 关系的关联:因此我可以在 usersplural)上调用 houses。换句话说,users.houses 会抓取所有 id 在users.pluck(:house_id) 生成的列表中的房屋。
【解决方案2】:

你不必实现self.houses; Rails 会为您做到这一点。

在您的用户模型 (user.rb) 中,执行以下操作

def User has_many :houses ... end

在你的房子模型中

def House belongs_to :user ... end

从那时起,some_user.houses 返回属于该用户的所有房屋。只需确保您的 Houses 表中有一个 user_id(整数)列即可。

【讨论】:

  • 谢谢,Adib,但是,正如我在上面对 Prakash 回答的评论中明确指出的那样,我希望能够做到 users.houses,而不是 user.houses。该方法将有效地完成我上面的self.houses 方法所做的事情(但是,正确)。知道该怎么做吗?
【解决方案3】:

嗯,users 将是 ArrayActiveRelation,而不是 User 类型

我会推荐用户的静态方法:

def self.houses_for_users(users)
  ..
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多