:friend_id def self.request(user, frien-6ren">
gpt4 book ai didi

ruby-on-rails - 在 Rails 中重构相同的模型

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

我使用连接表解决方案来建立这样的友谊:

class Contact < ActiveRecord::Base
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => :friend_id

def self.request(user, friend)
unless user == friend
current = find_by_user_id_and_friend_id(user, friend)

unless current
transaction do
create :user => user, :friend => friend, :status => "pending"
create :user => friend, :friend => user, :status => "requested"
end
end
end
end
...

我去创建组的成员资格,发现相同的场景:

class Member < ActiveRecord::Base
belongs_to :user
belongs_to :network

def self.request(user, network)
current = find_by_user_id_and_network_id(user, network)

unless current
transaction do
create :user => user, :network => network, :status => "pending"
create :user => network, :network => user, :status => "requested"
end
end
end
...

我用阻塞使这个变得复杂,这是很多重复的代码。

由于 belongs_to :friend, :class_name => "User", :foreign_key => :friend_id,将该键标识为具体代表用户,我认为我无法逃脱为用户 <-> 用户和用户 <-> 网络使用 Contact。我也可以通过 network_id 使它 belongs_to 成为一个网络,但我仍然觉得我必须将方法加倍才能解决这个问题。我想我可以将 type(:friend:network)传递给每个方法并像这样使用它:

      create :user => user, type => target, :status => "pending"
create :user => target, type => user, :status => "requested"

但是,有更好的解决方案吗?

我的另一个想法是始终使用术语 :friend,但也可以使用混合类或抽象类,并且只定义 belongs_to :friend 行两个文件。

最佳答案

关于ruby-on-rails - 在 Rails 中重构相同的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32573160/

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