我希望能够通过在不同模型对象的另一个关系上调用方法来返回AR关系。换句话说,给定一个User
模型belongs_to
House
模型(has_one
或has_many
用户)我希望能够建立关系users
和users.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
但有两个问题:
这感觉(可能不正确)就像应该是的东西 通过AR关系声明。
它无法正常工作。麻烦(如this
separate question中所述)是users.houses
工作正常,但是当我
做users.houses.addresses
,
该方法在House类上调用,而不是关系
users.houses
返回的房子(!?!)。因此,我收到undefined method 'map' for <Class:0x1232132131>
错误。
在Rails中是否有正确的方法 - 在关系级别上,基本上说一个关系属于另一个关系,或者一个模型属于另一个关系?
谢谢!
答案 0 :(得分:1)
在has_and_belongs_to_many
和User
模型之间实施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)
嗯,users
是Array
或ActiveRelation
,而不是User
类型
我建议用户使用静态方法:
def self.houses_for_users(users)
..
end