Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-组合多个具有多个通道_Ruby On Rails_Activerecord_Has Many Through_Arel - Fatal编程技术网

Ruby on rails Rails-组合多个具有多个通道

Ruby on rails Rails-组合多个具有多个通道,ruby-on-rails,activerecord,has-many-through,arel,Ruby On Rails,Activerecord,Has Many Through,Arel,我刚开始使用Rails,有一个我自己无法解决的问题: User.rb: has_many :bid_listings, through: :bids, source: :listing, uniq: true has_many :offer_listings, through: :offers, source: :listing, uniq: true 这两种方法都返回清单,并分别使用清单模型中的方法/范围,效果非常好。然而,当我尝试组合这些时,我得到了一个数组,在这里我不

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

User.rb:

has_many :bid_listings, through: :bids, source: :listing, uniq: true          
has_many :offer_listings, through: :offers, source: :listing, uniq: true
这两种方法都返回清单,并分别使用清单模型中的方法/范围,效果非常好。然而,当我尝试组合这些时,我得到了一个数组,在这里我不能应用列表模型的方法和作用域

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


p.S.用户有许多出价,用户有许多出价,出价属于列表,出价属于列表

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

编辑

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

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

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

这种方式应该仍然允许继续作用域,但效率较低,因为它将执行额外的查询。

如何组合它们?您确定要从列出的对象中调用方法和作用域吗?包括一些输出例如:我有一个列表范围,可以应用于bid_列表或offer_列表,例如:bid_列表。搜索('something')。但是,当我试图收集bid_列表+offer_列表的结果时,我得到了一个数组。我曾尝试使用finder_sql和UNION创建关系,但没有成功。将您正在编写的失败代码和错误输出作为问题的一部分-更容易看到您可能忽略的内容。这是不同外键上的另一个关系,不能使用这种方式:)用户可能是登录的买家,而且可能是卖家。User.listings将返回他出售的物品,无论是User.bid_物品还是User.offer_物品,返回他出价的物品或给卖家留下报价的物品。当我需要这个作为作用域,并且用户未知时,情况如何?首先,作用域通常是不可变的(您不会将参数传递给它们)。第二,如果您不认识用户,这是否意味着您希望搜索所有列表-Listing.all.search('a')?