gpt4 book ai didi

ruby-on-rails - 如何创建/维护对 ActiveRecord 关联中特定对象的有效引用?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:15 26 4
gpt4 key购买 nike

使用 ActiveRecord,我有一个对象 Client,它有零个或多个用户(即通过 has_many 关联)。客户端还有一个可以手动设置的“primary_contact”属性,但始终必须指向关联用户之一。 IE。如果没有关联用户,primary_contact 只能为空。

实现 Client 的最佳方式是什么:

a) 第一次将用户添加到客户端时,primary_contact 是否设置为指向该用户?

b) primary_contact 始终保证在用户关联中,除非所有用户都被删除? (这有两部分:设置新的 primary_contact 或从关联中删除用户时)

换句话说,我如何为给定客户的用户之一指定和重新分配“主要联系人”的头衔?我已经修改了许多过滤器和验证,但我就是做对了。任何帮助将不胜感激。


更新:虽然我确定有无数的解决方案,但我最终让用户在删除时通知客户端,然后在客户端中使用 before_save 调用来验证(并在必要时设置)其主要联系人。此调用是由用户在删除之前触发的。这在更新关联时并没有捕获所有的边缘情况,但它足以满足我的需要。

最佳答案

我的解决方案是在连接模型中执行所有操作。我认为这在客户端转换为零关联或从零关联转换时工作正常,如果存在任何现有关联,始终保证指定主要联系人。我很想听听任何人的反馈。


我是新来的,所以不能在下面评论 François。我只能编辑我自己的条目。他的解决方案假定用户到客户端是一对多,而我的解决方案假定多对多。我在想用户模型可能代表一个“代理”或“代表”,并且肯定会管理多个客户。这个问题在这方面是模棱两可的。


class User < ActiveRecord::Base
has_many :user_clients, :dependent => true
has_many :clients, :through => :user_client

end

class UserClient < ActiveRecord::Base

belongs_to :user
belongs_to :client

# user_client join table contains :primary column

after_create :init_primary
before_destroy :preserve_primary

def init_primary
# first association for a client is always primary
if self.client.user_clients.length == 1
self.primary = true
self.save
end
end

def preserve_primary
if self.primary
#unless this is the last association, make soemone else primary
unless self.client.user_clients.length == 1
# there's gotta be a more concise way...
if self.client.user_clients[0].equal? self
self.client.user_clients[1].primary = true
else
self.client.user_clients[0].primary = true
end
end
end
end

end

class Client < ActiveRecord::Base
has_many :user_clients, :dependent => true
has_many :users, :through => :user_client

end

关于ruby-on-rails - 如何创建/维护对 ActiveRecord 关联中特定对象的有效引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796071/

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