【问题标题】:Create Rails scope comparing fields on two tables创建 Rails 范围比较两个表上的字段
【发布时间】:2017-03-21 01:13:02
【问题描述】:

我在一个应用程序中有许多关联的表

class Listing < ActiveRecord::Base
  belongs_to :house
  belongs_to :multiple_listing_service
end

class House < ActiveRecord::Base
  has_one :zip_code
  has_one :primary_mls, through: :zip_code
end

我想创建一个范围,以生成与关联房屋的主要 MLS 相关的所有清单。换句话说,范围应该生成关联房屋的 multiple_listing_service_id = primary_mls.id 的所有列表。

我已经尝试了几十个嵌套连接范围,但似乎都没有。充其量他们只是返回所有列表,通常他们会失败。

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord named-scope


    【解决方案1】:

    如果我理解正确,我不确定纯作用域是否适合。假设您有:

    class MultipleListingService < ActiveRecord::Base
      has_many :listings
      has_many :zip_codes
    end
    

    我会选择类似的东西:

    class House < ActiveRecord::Base
      ...
    
      def associated_listings
        primary_mls.listings
      end
    end
    

    更新 1

    如果您的目标只是获得主要列表,那么我会在 Listing 中添加一个 is_primary 字段。这将是最有效的。另一种方法是 3 表连接,它可以工作但很难很好地优化:

    class Listing < ActiveRecord::Base
      ...
      scope :primary, -> { joins(:houses => [:zip_codes])
                          .where('zip_codes.multiple_listing_service_id = listings.multiple_listing_service_id') }
    

    【讨论】:

    • 我有一个类似的方法,这对于一个实例来说很好,但我需要获取所有主要列表的数组,以便我可以从中生成一些图表。将所有内容加载到内存中需要很长时间
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多