检查一个项目是否在另一个模型的“has_many”字段中的最简单方法?
easiest way to check if an item is in `has_many` field of another model?
我有 3 个表,cooler
、cpu
、socket
。一个cooler
(支持/)has_many
sockets
和cpu
belongs_to
socket
。现在我检查 cooler
是否支持 cpu
的最简单方法是什么?
@cooler.sockets.include? @cpu.socket # => False always no matter what
我尝试使用以下方法检查类型:
@cooler.sockets.class
#=> #Socket::ActiveRecord_Associations_CollectionProxy
您的代码:
@cooler.sockets.include? @cpu.socket
总是returnsfalse
,因为这里你试图检查Cpu
的模型实例socket
属性是否包含在[=16=的数组中] 模型实例对应于 Cooler
模型实例,这永远不可能发生。
但是,您可以通过 .exists?
:
完成您想要的
@cooler.sockets.exists?(socket: @cpu.socket)
或.present?
:
@cooler.sockets.where(socket: @cpu.socket).present?
解释并提供了几种方法来解决您的需求。这是我能想到的一种方法:
@cooler.sockets.where(socket: @cpu.socket).any?
阅读any?
方法。
我有 3 个表,cooler
、cpu
、socket
。一个cooler
(支持/)has_many
sockets
和cpu
belongs_to
socket
。现在我检查 cooler
是否支持 cpu
的最简单方法是什么?
@cooler.sockets.include? @cpu.socket # => False always no matter what
我尝试使用以下方法检查类型:
@cooler.sockets.class
#=> #Socket::ActiveRecord_Associations_CollectionProxy
您的代码:
@cooler.sockets.include? @cpu.socket
总是returnsfalse
,因为这里你试图检查Cpu
的模型实例socket
属性是否包含在[=16=的数组中] 模型实例对应于 Cooler
模型实例,这永远不可能发生。
但是,您可以通过 .exists?
:
@cooler.sockets.exists?(socket: @cpu.socket)
或.present?
:
@cooler.sockets.where(socket: @cpu.socket).present?
@cooler.sockets.where(socket: @cpu.socket).any?
阅读any?
方法。