2011-01-14 101 views
28

我已经在过去设置了这个HABTM关系,并且之前工作过....现在它不是,我在我的智慧最终试图找出什么是错的。我一整天都在看导轨指南,而且似乎无法弄清楚我做错了什么,所以帮助真的很感激。Rails - HABTM关系 - 如何根据关联模型的属性查找记录

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

Event.rb

has_and_belongs_to_many :interests 

Interest.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 ]) 
创建一个连接表迁移3210

但得到了错误“没有找到名为'interest'的协会;也许你拼错了它“......这我没有,当然

我试图

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

,但得到的错误”未定义的方法'利益的#Class:0x4383348"

我怎么能发现有4感兴趣ID的活动....我肯定从这个笑

回答

67

您需要包括利益表秃顶。

@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) 
5

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

@events = Event.all.where('events.id' => @interest.events.each(&:id)) 

这为我工作,因为我已经与IDS的事件列表中的实例化对象@interest。当然,你并没有使用轨道可用的一些魔术。此外,我无法让您的解决方案与“不”合作。例如;

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

不起作用。它会返回0结果。但是这个:

@events = Event.all.where.not('events.id' => @interest.events.each(&:id)) 

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

相关问题