多个外键 _ has_many
Multiple Foreign Keys _ has_many
在 Rails 中,我需要一个模型有一个 has_many
和两个需要匹配的外键才能生成列表。
例如:
Organization_Profiles
table结构
id : int
profile_id : int
organization_id : int
协会
belongs_to: :profile
belongs_to: :organization
has_many: :notifications, foreign_keys: [:profile_id, :organization_id], dependent: :destroy
通知
table结构
id : int
profile_id : int
organization_id : int
level : int
message : string
协会
belongs_to: :profile
belongs_to: :organization
我怎样才能完成上述任务?根据我的研究,foreign_keys: []
不存在。
您可以在不依赖协会的 dependent
命令的情况下完成此操作。我能想到的最好的方法是 'clean out' 采取行动解除 Profile
与 Organization
的关联。您可以在 Organization
中使用逆向方法。
class Profile < ActiveRecord:Base
def method_that_disassociates_from(inputted_organization)
self.organizations.delete(inputted_organization)
self.notifications.where(organization_id: inputted_organization.id).destroy_all
end
end
我想为我的应用程序的最基本的消息传递功能做一些类似的事情。
我有一个包含 user1_id 和 user2_id 的对话模型,每条消息都有一个 user_id(对于发件人)和一个 conversation_id(从中可以猜收件人)。
理想情况下我会写这样的东西:
has_many :conversations, foreign_key: {:user1_id, :user2_id}, dependent: :destroy
我最终重新定义了自己的方法:
class User < ApplicationRecord
after_destroy :delete_conversations
def conversations
Conversation.where('user1_id = :id OR user2_id = :id', id: id)
end
private
def delete_conversations
Conversation.where('user1_id = :id OR user2_id = :id', id: id).map(&:destroy)
end
end
在 Rails 中,我需要一个模型有一个 has_many
和两个需要匹配的外键才能生成列表。
例如:
Organization_Profiles
table结构
id : int
profile_id : int
organization_id : int
协会
belongs_to: :profile
belongs_to: :organization
has_many: :notifications, foreign_keys: [:profile_id, :organization_id], dependent: :destroy
通知
table结构
id : int
profile_id : int
organization_id : int
level : int
message : string
协会
belongs_to: :profile
belongs_to: :organization
我怎样才能完成上述任务?根据我的研究,foreign_keys: []
不存在。
您可以在不依赖协会的 dependent
命令的情况下完成此操作。我能想到的最好的方法是 'clean out' 采取行动解除 Profile
与 Organization
的关联。您可以在 Organization
中使用逆向方法。
class Profile < ActiveRecord:Base
def method_that_disassociates_from(inputted_organization)
self.organizations.delete(inputted_organization)
self.notifications.where(organization_id: inputted_organization.id).destroy_all
end
end
我想为我的应用程序的最基本的消息传递功能做一些类似的事情。
我有一个包含 user1_id 和 user2_id 的对话模型,每条消息都有一个 user_id(对于发件人)和一个 conversation_id(从中可以猜收件人)。
理想情况下我会写这样的东西:
has_many :conversations, foreign_key: {:user1_id, :user2_id}, dependent: :destroy
我最终重新定义了自己的方法:
class User < ApplicationRecord
after_destroy :delete_conversations
def conversations
Conversation.where('user1_id = :id OR user2_id = :id', id: id)
end
private
def delete_conversations
Conversation.where('user1_id = :id OR user2_id = :id', id: id).map(&:destroy)
end
end