【发布时间】:2017-05-19 03:36:02
【问题描述】:
我正在使用 Ruby on Rails 构建一个家庭相册应用程序。我有两个主要表:“家庭”和“成员”。家庭有_许多成员。
当我创建一个“家庭”的新“成员”时,我试图跟踪该新成员与原始成员的关系。我的应用程序允许您创建一个原始成员,然后必须从现有成员的显示页面创建所有其他成员。这个想法是不允许在没有与现有成员建立关系的情况下将任何新成员添加到家庭中。这将避免与其他任何人无关的浮动成员。
我有一个名为“parent_id”的列。创建新成员时,您可以将当前成员的 id(表单在成员显示视图中)添加为新成员的 parent_id。这链接了记录,以便以后可以引用它们。
我的问题很简单。在成员的显示视图中,我想要一个表格来显示所有具有 parent_id == 当前成员 ID 的成员。很简单,但我无法让它工作。这就是我现在拥有的:
<table class="table table-striped">
<tr>
<td>First</td>
<td>Last</td>
<td>Birthplace</td>
</tr>
<% @members.where("parent_id == @member.id").each do |p| %>
<tr>
<td><%= p.first_name %></td>
<td><%= p.last_name %></td>
<td><%= p.birthplace %></td>
</tr>
<% end %>
</table>
这是这段代码抛出的错误:
SQLite3::SQLException: near ".": syntax error: SELECT "members".* FROM "members" WHERE "members"."family_id" = ? AND (parent_id == @member.id)
这是我的成员控制器中的显示操作:
def show
@family = Family.find(params[:family_id])
@member = Member.find(params[:id])
@new = Member.new
@members = @family.members
end
这是我的两个表的架构:
create_table "families", force: :cascade do |t|
t.string "title"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "members", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "birthplace"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "family_id"
t.integer "parent_id"
t.integer "child_id"
t.integer "sibling_id"
end
【问题讨论】:
-
你的领域模型只是不会削减它。您需要一系列连接表,而不是仅仅试图将所有内容塞进两个表中。例如,您的模型不允许成员拥有多个兄弟姐妹或属于多个家庭。您需要阅读自引用关联并返回绘图板。
标签: ruby-on-rails