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没有关联的事件.
| 归档时间: |
|
| 查看次数: |
14645 次 |
| 最近记录: |