Active Record查询关系以获得其他关系

时间:2015-01-10 17:03:00

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

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

注意 - 我没有尝试创建一个user.houses方法(单一用户),而是一个users.houses方法,它抓住所有ids的房子属于house_id列表中所有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>错误。

  3. 在Rails中是否有正确的方法 - 在关系级别上,基本上说一个关系属于另一个关系,或者一个模型属于另一个关系?

    谢谢!

3 个答案:

答案 0 :(得分:1)

has_and_belongs_to_manyUser模型之间实施House关系可能会让您更轻松地完成您想要的工作。

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

答案 1 :(得分:0)

您不必实施self.houses; Rails为你做这件事。

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

def User has_many :houses ... end

并在您的House模型中

def House belongs_to :user ... end

从那里开始,some_user.houses返回属于该用户的所有房屋。只需确保Houses表中有user_id(整数)列。

答案 2 :(得分:0)

嗯,usersArrayActiveRelation,而不是User类型

我建议用户使用静态方法:

def self.houses_for_users(users)
  ..
end