【问题标题】:Rails - combine multiple has_many throughsRails - 结合多个 has_many throughs
【发布时间】:2012-08-26 05:57:12
【问题描述】:

我刚开始使用 Rails,遇到一个我自己无法解决的问题:

用户.rb:

has_many :bid_listings, through: :bids, source: :listing, uniq: true          
has_many :offer_listings, through: :offers, source: :listing, uniq: true

这两个返回列表以及使用列表模型中的方法/范围都可以完美地工作。但是,当我尝试组合这些时,我得到了一个数组,我无法在其中应用列表模型的方法和范围。

我尝试了多种方法,但都卡住了。请帮忙。

附:用户有很多出价,用户有很多报价,出价属于列表,报价属于列表

【问题讨论】:

  • 你是如何组合它们的?您确定要调用列表对象的方法和范围吗?包括一些输出
  • 例如:我有一个适用于 bid_listings 或 offer_listings 的列表范围,例如:bid_listings.search('something') 但是,当我尝试连接 bid_listings + offer_listings 的结果时- 我得到一个数组。我尝试使用 finder_sql 和 UNION 创建关系,但没有成功。
  • 在问题中包含您正在编写的失败代码和错误输出 - 更容易看到您可能忽略的内容。

标签: ruby-on-rails activerecord has-many-through arel


【解决方案1】:

您在 Array 对象上调用实例方法,而不是在 ActiveRecord 对象上。因此,Array 类型的对象不知道搜索方法是什么。试试这个:

编辑

user = User.first
listings = Listing.joins(:bids).joins(:offers).where(:bids => {:user_id => user.id}, :offers => {:user_id => user.id})
listings.search('a')

【讨论】:

  • 这是不同foreign_key上的另一个关系,不能这样使用:)
  • 用户可以是listing的买家,也可以是卖家。 User.listings 将返回他出售的列表,无论 user.bid_listings 和 user.offer_listings 返回他出价的列表还是向卖家留下报价
  • 当我需要这个作为范围,而用户未知的情况下呢?
  • 首先,作用域通常不是可变的(你不会将参数传递给它们)。其次,如果您不认识用户,这是否意味着您要搜索所有列表 - Listing.all.search('a')?
【解决方案2】:

我遇到了类似的问题,我想出的最佳解决方案是:

def buying_listings
  Listing.find_by_sql(bid_listings.union(offer_listings).to_sql)
end

这种方式仍应允许您继续范围界定,但效率较低,因为它会执行额外的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多