【问题标题】:Rails - referencing other members of same tableRails - 引用同一张表的其他成员
【发布时间】: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


【解决方案1】:

您正在尝试访问 @members 对象中的 id 属性,这可能是来自 Member 模型的 ActiveRecord_Associations_CollectionProxy

如果您创建@members.inspect,您将看到其中的每个元素,因为数组值具有id,但没有对象本身。

如果您遍历每个元素,您可以获得每个member id 属性,然后您可以进行比较parent_id = member.id,如果您执行'parent_id = ?', member.id 以避免SQLi,这可能会更安全。

但我认为您可以更轻松地检查@members 上的成员,只需比较其属性:

<% @members.each do |member| %> 
  <% if member.parent_id == member.id  %>
    <tr>
      <td><%= member.first_name %></td>
      <td><%= member.last_name %></td>
      <td><%= member.birthplace %></td>
    </tr>
  <% end %>
<% end %>

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2015-06-10
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多