【发布时间】:2015-01-10 17:02:59
【问题描述】:
我希望能够通过调用不同模型对象的另一个关系上的方法来返回 AR 关系。换句话说,给定一个User 模型,其中belongs_to 一个House 模型(has_one 或has_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
不过有两个问题:
这感觉(可能是错误的)应该是 可通过 AR 关系声明。
它无法正常工作。麻烦(如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 用户感到困惑
-
这是一个假设模型,代表我的应用程序中不太直观的建模。我将在上面举一个例子。在我的应用中,第二个模型(此处为
House)has_many。
标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord