2017-05-18 48 views
0

我正在用Ruby on Rails構建家庭相冊應用程序。我有兩張主桌:「家庭」和「會員」。家庭has_many成員。Rails - 引用同一表的其他成員

當我創建一個「家庭」的新「成員」時,我試圖跟蹤與原始成員的新成員關係。我的應用程序允許您創建一個原始成員,然後所有其他成員必須從現有成員的顯示頁面創建。這個想法是不允許任何新成員在沒有與現有成員建立關係的情況下被添加到家庭中。這將避免與其他人無關的浮動成員。

我有一個名爲「parent_id」的列。當創建新成員時,可以將當前成員的id(表單在成員show view中)添加爲新成員的parent_id。這將鏈接記錄,以便稍後可以引用它們。

我的問題很簡單。在成員的show view中,我想要一個表來顯示所有擁有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) 

這裏是我的成員控制器的show動作:

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 
+0

你的域模型只是不會削減它。你需要一系列連接表,而不是僅僅試圖將所有內容都塞進兩個表中。例如,您的模型不允許成員擁有多個兄弟姐妹或屬於多個家庭。您需要閱讀自我參照關聯並返回到繪圖板。 – max

回答

1

您正試圖訪問@members對象內的id屬性,該對象可能是Member型號中的ActiveRecord_Associations_CollectionProxy

如果您製作一個@members.inspect,您會看到其中的每個元素,因爲數組值不包含對象本身。

,如果你遍歷每個元素,然後以這種方式你能夠作出比較parent_id = member.id,如果你這樣做'parent_id = ?', member.id避免SQLI這可能是更安全的,您可以得到每個member id屬性。

但我認爲你可以檢查容易的成員@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 %> 
相關問題