gpt4 book ai didi

ruby-on-rails - 用于 has_many 关系的 Rails 动态外键

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:37 25 4
gpt4 key购买 nike

我有一个用于保存所有用户的用户模型。我的应用程序中有两种类型的用户,导师和学生,但他们具有相同的结构。

我想做这样的事情。

has_many :requests, :foreign_key => mentor? ? 'mentor_id' : 'student_id', :class_name => 'Request'

我有良师益友?模型中的方法,但它给了我一个 method_missing 错误。我假设这是因为它正在寻找 dynamic_matchers.rb 中的方法

这是它给出的错误

/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:55:in 'method_missing': undefined method 'mentor?' for #<Class:0x00000001b40630> (NoMethodError)

有没有办法在不为学生和导师制作单独模型的情况下解决这个问题?我觉得看到他们都使用相同的字段是没有必要的。

最佳答案

好吧,让我纠正一下:这是不可能的,即使在乌托邦式的世界中是不可能的,或者您找到了解决方法,这肯定不正确

您实际上要寻找的是继承(Rails 中的 STI 或单表继承)和多态性的混合体。

如何以正确的方式实现它?

你有一个用户模型,学生导师都是用户,所以他们都会继承这个模型。

class User < ActiveRecord::Base
end

class Student < User
end

class Mentor < User
end

这意味着什么?好吧,这意味着 User 模型拥有(无需您做任何其他事情)一个字段 type 将包含 'Student' 或 'Mentor' 或什么都不包含,具体取决于您如何初始化对象:

user = User.create()
student = Student.create()
mentor = Mentor.create()

现在,您的请求可以属于学生或属于导师。所以在这里你可以像这样设置一个多态关联:

class Student < User
has_many :requests, as: :owner
end

class Mentor < User
has_many :requests, as: :owner
end

class Request < ActiveRecord::Base
belongs_to :owner, polymorphic: true
end

现在你可以写:

student.requests
mentor.requests
request.owner

关于ruby-on-rails - 用于 has_many 关系的 Rails 动态外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16511918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com