我有一个Track表和一个Section表。轨道有很多部分。 Section通过Section:track_id连接到各自的任务,track_id对应于Track的id属性。
<% @track = Track.find(params[:id]) %>
<% @sections = Section.find_by_track_id(@track.id) %>
在上面的代码中,我试图找到多个共享相同的部分:track_id属性,但find_by_track_id()只返回第一个。什么是获得所有这些的最好方法?
谢谢!
答案 0 :(得分:6)
如果您的曲目和部分以这种方式相关,那么关联它们的最佳方式是使用自动从Rails关联中获得的方法。
在这种情况下,我希望在您的模型文件中,您有以下内容:
class Track < ActiveRecord::Base
has_many :sections
end
class Section < ActiveRecord::Base
belongs_to :track
end
然后你可以得到像这样的曲目的部分:
@track = Track.find(params[:id])
@sections = @track.sections
答案 1 :(得分:5)
您正在寻找where
,它会查找满足特定条件的所有记录。
@sections = Section.where(track_id: @track.id)
这与您的问题无关,但您应在控制器中设置@sections
和@track
。由于您似乎是Rails的新手,我强烈建议您阅读Rails Guides。他们将为您的旅程提供极大的帮助。
编辑:我正在解决一般问题“在Rails中按属性查找多个数据库对象?”,这是在一般情况下如何查找多个数据库对象。 @TarynEast的方法是找到sections
的所有track
的方法,或更一般地说,找到属于所需对象的所有对象。对于您要求的特定情况,请使用@ TarynEast的解决方案。
答案 2 :(得分:3)
<强>协会强>
要扩展Taryn East
的答案,您需要查看ActiveRecord Associations。
在您的模型中,如果您有以下has_many
关系:
#app/models/track.rb
Class Track < ActiveRecord::Base
has_many :sections
end
#app/models/section.rb
Class Section < ActiveRecord::Base
belongs_to :track
end
这会在您的tracks
和sections
数据表之间建立relational database关联。
-
关联数据
Rails的魔力在这里发挥作用
当您调用“父”对象时,您将能够使用其primary key
(通常是ID
)找到它。当Rails自动将此primary_key
用作子模型的foreign_key
时,就会发生魔术 - 允许您将其所有数据作为附加到父对象的内容进行调用:
@track = Track.find params[:id] #-> find single Track by primary key
@sections = @track.sections #-> automagically finds sections using the track primary key
这意味着如果您拨打以下电话,它将完全符合您的要求:
@sections.each do |section|
section.name
end
<强>其中强>
最后,如果您想一次查找多条记录,则应确定应使用哪种ActiveRecord
方法:
find
是按id
finy_by key: "value"
是按您定义的键/列where
将使用您自己的条件返回多个项目因此,要回答您的基线问题,您需要使用where
:
@sections = Section.where track_id: params[:id]
这不是正确的答案,但它可以帮助您
答案 3 :(得分:-1)
<% @sections=@track.sections%>
答案 4 :(得分:-1)
当您查找由其ID标识的特定元素时,请使用find。
Model.find
正在使用主键列。因此总会有一个或没有结果。