困惑于has_many通过:和使用class_name的替代模式的优势

时间:2014-04-15 14:47:28

标签: ruby-on-rails ruby ruby-on-rails-4

我现在有这个。

has_many :planes, -> { where approved: true },  class_name: 'UserPlane'

我想它有点气味,但它很有效,很容易做到。我想正确的方法是做这样的事情。

has_many :planes, through: :user_planes, source: :plane do
   def approved
     where('user_planes.approved = ?', true)
   end
end

has_many :user_planes

因为我只想要获得批准的飞机,而我不关心那些没有批准的飞机。与第一种方式相反,采用第二种方式有什么好处。感谢。

1 个答案:

答案 0 :(得分:2)

这两个片段会给你不同的结果。第一个关联将从数据库返回一组UserPlane个对象,而第二个关联将返回一组Plane个对象。但是,您应该能够将第二个版本简化为:

has_many :user_planes, -> { where approved: true }
has_many :planes, through: :user_planes, source: :plane