Ruby on rails HABTM关系——如何根据关联模型的属性查找记录

Ruby on rails HABTM关系——如何根据关联模型的属性查找记录,ruby-on-rails,find,has-and-belongs-to-many,Ruby On Rails,Find,Has And Belongs To Many,我在过去建立了这种HABTM关系,以前也有过这种关系……现在不是了,我绞尽脑汁想弄清楚到底出了什么问题。我看了一整天的导轨,似乎不知道我做错了什么,所以我真的很感激你的帮助 我有两个通过连接模型连接的模型,我正试图根据关联模型的属性查找记录 Event.rb has_and_belongs_to_many :interests 利息.rb has_and_belongs_to_many :events 以及创建的联接表迁移,如: create_table 'events_interests'

我在过去建立了这种HABTM关系,以前也有过这种关系……现在不是了,我绞尽脑汁想弄清楚到底出了什么问题。我看了一整天的导轨,似乎不知道我做错了什么,所以我真的很感激你的帮助

我有两个通过连接模型连接的模型,我正试图根据关联模型的属性查找记录

Event.rb

has_and_belongs_to_many :interests
利息.rb

has_and_belongs_to_many :events
以及创建的联接表迁移,如:

create_table 'events_interests', :id => false do |t|
    t.column :event_id, :integer
    t.column :interest_id, :integer
end
我试过:

@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ] )
@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ] )
但我得到了一个错误:

“未找到名为‘兴趣’的关联;可能是您拼错了?”

我没有偏离轨道

我试过:

@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ] )
@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ] )
但我得到了一个错误:

#类:0x4383348的未定义方法“兴趣”


我如何才能找到兴趣id为4的事件…我肯定会因为这个lol而变得秃顶

你需要包括兴趣表

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4])
你在你的帖子里说得对,但你没有把兴趣多元化

更新

因为这个答案仍然受到关注,我认为使用
ActiveRecord::Relation
语法更新它可能是一个好主意,因为上面的方法将被弃用

@events = Event.includes(:interests).where(interests: { id: 4 })

如果你想要一个自定义条件

@events = Event.includes(:interests).where('interests.id >= 4')

答案很有帮助,谢谢!我知道这篇文章很旧,但我提出了一个可能对某人有用的不同解决方案。我注意到在我的例子中,生成的查询相当长。对我来说,与“兴趣”表相等的表中有很多列和数据。为了避免在该表中搜索匹配的id,我的解决方案与此类似:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 
这对我很有用,因为我已经有了一个带有事件ID列表的@interest实例对象。当然,您没有使用rails提供的一些魔力。而且,我无法让你的解决方案与“不”一起工作。比如,

@events = Event.includes(:interests).where.not(interests: { id: 4 })
这是行不通的。它将返回0个结果。但这是:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 
将起作用,它将返回所有与@interest没有关联的事件。

#includes将提取所有“interest”对象。如果您只想过滤,那么还有另一个方法#joins,它将只进行过滤。