Rails - HABTM关系 - 如何根据关联模型的属性查找记录

Chr*_*len 36 ruby-on-rails find has-and-belongs-to-many

我过去已经建立了这种HABTM关系并且它之前有效....现在它不是,我在我的智慧结束时试图弄清楚什么是错的.我整天都在看导轨指南,似乎无法弄清楚我做错了什么,所以真的很感激帮助.

我有2个模型通过连接模型连接,我试图找到基于相关模型的属性的记录.

Event.rb

has_and_belongs_to_many :interests
Run Code Online (Sandbox Code Playgroud)

Interest.rb

has_and_belongs_to_many :events
Run Code Online (Sandbox Code Playgroud)

以及创建的连接表迁移

  create_table 'events_interests', :id => false do |t|
      t.column :event_id, :integer
      t.column :interest_id, :integer
   end
Run Code Online (Sandbox Code Playgroud)

我试过了

 @events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ] )
Run Code Online (Sandbox Code Playgroud)

但得到错误"没有找到名为'兴趣'的协会;也许你拼错了它?"......当然我没有

我试过了

  @events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ] )
Run Code Online (Sandbox Code Playgroud)

但得到错误"#Class的未定义方法`兴趣':0x4383348"

我怎样才能找到兴趣ID为4的事件....我肯定会从这个哈哈发出光头

Sea*_*ill 80

您需要包含兴趣表.

@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4])
Run Code Online (Sandbox Code Playgroud)

你在帖子中说得对,但你没有多元化的兴趣.

更新

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

@events = Event.includes(:interests).where(interests: { id: 4 })
Run Code Online (Sandbox Code Playgroud)

要么

@events = Event.includes(:interests).where('interests.id' => 4)
Run Code Online (Sandbox Code Playgroud)


小智 7

答案很有帮助,谢谢!我知道这篇文章很老,但我提出了一个可能对某人有用的不同解决方案.我注意到在我的情况下查询生成很长.对我来说,与你的"兴趣"表相同的表中有很多列和数据.为了避免在该表中搜索匹配的id,我的解决方案看起来类似于:

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 
Run Code Online (Sandbox Code Playgroud)

这对我有用,因为我已经有一个带有事件的id列表的实例@interest对象.当然,你没有使用铁轨可用的一些魔力.另外,我无法让你的解决方案与"不"一起工作.例如;

@events = Event.includes(:interests).where.not(interests: { id: 4 })
Run Code Online (Sandbox Code Playgroud)

不行.它会返回0结果.但是这个:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 
Run Code Online (Sandbox Code Playgroud)

会工作,这将返回所有与@interest没有关联的事件.