我正在我的应用程序中构建一个分层的组织列表,使用与我用于各种对象的一对多连接相同的原则。
但是这个一对多的自联接,我得到一个错误,因为生成的SQL引用了一个不存在的organisations.organisation_id列。
以下是我的代码的一部分:
class Organisation < ActiveRecord::Base
validates :owner_id, presence: true
validates :status_id, presence: true
validates :playground_id, presence: true
belongs_to :owner, :class_name => "User", :foreign_key => "owner_id" # helps retrieving the owner name
belongs_to :status, :class_name => "Parameter", :foreign_key => "status_id" # helps retrieving the status name
belongs_to :parent_org, :class_name => "Organisation", :foreign_key => "parent_id" # helps retrieving the parent name
has_many :child_orgs, :class_name => "Organisation" # links from the child organisations
路线(我只能从其父路线创建一个组织):
resources :organisations do
resources :organisations, :only=>[:new, :create]
end
控制器:
# GET /organisations/1
# GET /organisations/1.json
def show
@organisation = Organisation.includes(:owner, :status, :parent_org).find(params[:id])
end
列出当前组织的儿童的节目视图的摘录:
<table width=100%>
<tr><td><hr /></td></tr>
<tr align="left">
<th>Linked organisations</th>
<th></th>
</tr>
<tr>
<td>
<table class="table table-striped table-condensed">
<tr align="left">
<th> Code </th>
<th> Name </th>
<th> Description </th>
<th> Updated by </th>
<th> Updated at </th>
</tr>
<%@organisation.child_orgs.each do |child_org| %>
<tr align="left">
<td valign="top"> <%=link_to child_org.code, child_org%> </td>
<td valign="top"> <%=child_org.name%> </td>
<td class="col_wide"> <%=child_org.description%> </td>
<td valign="top"> <%=child_org.updated_by%> </td>
<td valign="top"> <%=child_org.updated_at%> </td>
</tr>
<% end%>
</table>
</td>
</tr>
<tr>
<td>
<%= link_to 'Add organisation', new_organisation_child_org_path(@organisation) %>
</td>
</tr>
</table>
我收到消息: ActiveRecord :: StatementInvalid in Organizations#show ,因为生成的SQL引用了一个不存在的organisations.organisation_id列:
SELECT "organisations".* FROM "organisations" WHERE "organisations"."organisation_id" = ?
我的问题:
1 - 我怎样才能发现这个错误?
2 - new_organisation_child_org_path(@organisation)路径是否正确用于创建子组织?
非常感谢你的帮助!
致以最诚挚的问候,
佛瑞德
答案 0 :(得分:1)
您需要在has_many association上指定foreign_key:
has_many :child_orgs, :class_name => "Organisation" , :foreign_key => 'parent_id'
答案 1 :(得分:0)
在您的情况下,最好使用finder_sql或范围,具体取决于您使用哪个版本的rails来选择子组织,以避免将child_id属性添加到组织表中。
in organization.rb
Rails 3
has_many :child_orgs, class_name: "Organization", finder_sql: proc { "SELECT * FROM organizations WHERE parent_id = #{id}" }
Rails 4(未经测试)
has_many :child_orgs, ->(id) { where(parent_id: id) }, class_name: "Organization"
您需要致电的路线
new_organization_organizations_path(@organization)
键入控制台rake routes
以查看所有可用路由