1

这是我的模型:

class Flight < ActiveRecord::Base
  has_many :seats, dependent: :destroy, inverse_of: :flight
end

class Seat < ActiveRecord::Base
  belongs_to :flight, inverse_of: :seats
end

看起来inverse_of效果很好,但是当我使用条件时它不起作用:

f1 = Flight.first
s1 = f1.seats.first
s2 = f1.seats.second
s3 = f1.seats.where(id: 0..1000000).third

s1.flight.equal? s2.flight
=> true
s1.flight.equal? s3.flight
=> false

这是什么解释?我怎样才能使这项工作?

4

2 回答 2

0
s1.flight.equal? s2.flight
=> true

上面的结果为真,因为s1.flights2.flight引用完全相同的 Ruby 对象

s1.flight.equal? s3.flight

在这里,s1.flights3.flight不同的 Ruby 对象。它们都包含相同的记录数据(包括相同的:id值)

问题是您使用的是 Ruby 的equal?方法,而您应该使用 Rails==eql?比较器。

来自RubyObject文档== (别名为eql?and equal?

平等——在对象级别,== 仅当 obj 和 other 是同一个对象时才返回 true。通常,此方法在后代类中被覆盖以提供特定于类的含义。

不幸equal?是,在. 来自Rails 文档(别名为ActiveRecord::Base== eql?

如果 compare_object 是同一个确切的对象,或者 compare_object 是相同的类型并且 self 有一个 ID 并且它等于 comparison_object.id,则返回 true。

你会发现这与:inverse_of. 一个简单的例子,你可以试试

f1 = Flight.all.first
f2 = Flight.all.first

f1.eql? f2
=> true

f1 == f2
=> true

f1.equal? f2 # Direct Object comparison (skips ActiveRecord::Base)
=> false
于 2013-04-20T06:43:21.227 回答
0

Inverse_of选项不适用于条件,这就是为什么s1.flights3.flight不相等 -ActiveRecord只是在你做的时候从数据库中重新加载对象s3.flight。这似乎是记录在案的行为,请参阅https://github.com/rails/rails/issues/23693#issuecomment-184438933

于 2017-01-26T14:34:02.307 回答