0

嗨,我通過關係爲我的應用has_many有點麻煩,並希望找到一些幫助。所以我有用戶&講座。講座由一個用戶創建,但其他用戶則可以「加入」已創建的講座。用戶擁有他們自己創建的講座的簡介Feed &也有朋友創建的講座摘要。然而,這個問題不是要創建一個講座,而是要「加入」已經創建的講座。我創建了一個「講座關係」模型&控制器來處理已加入的用戶(我稱其爲「活動人員」)的講座&之間的這種關係。用戶還必須「退出」講座(通過單擊「退出」或導航到其中一個標題導航鏈接)。我很感激,如果任何人都可以通過一些這和我一起工作......ruby​​ on rails has_many通過關係

我有: users.rb的模型 Lectures.rb模型 Users_controller Lectures_controller

那麼下面的模型

lecturerelationship.rb

class lecturerelationship < ActiveRecord::Base 
    attr_accessible :active_id, :joinedlecture_id 

    belongs_to :active, :class_name => "User" 
    belongs_to :joinedlecture, :class_name => "Lecture" 

    validates :active_id, :presence => true 
    validates :joinedlecture_id, :presence => true 

end 

lecturerelationships_controller.rb

已創建(通過朋友)顯示在用戶210個
class LecturerelationshipsController < ApplicationController 
    before_filter :signed_in_user 

    def create 
    @lecture = Lecture.find(params[:lecturerelationship][:joinedlecture_id]) 
    current_user.join!(@lecture) 
    redirect_to @lecture 
    end 

def destroy 
    @lecture = Lecturerelationship.find(params[:id]).joinedlecture 
    current_user.exit!(@user) 
    redirect_to @user 
end 

end 

講座飼料中的以下文件

_activity_item.html.erb

<li id="<%= activity_item.id %>"> 
    <%= link_to gravatar_for(activity_item.user, :size => 200), activity_item.user %><br clear="all"> 
    <%= render :partial => 'shared/join', :locals => {:activity_item => activity_item} %> 
    <span class="title"><%= link_to activity_item.title, lecture_url(activity_item) %></span><br clear="all"> 
    <span class="user"> 
    Joined by <%= link_to activity_item.user.name, activity_item.user %> 
    </span><br clear="all"> 
    <span class="timestamp"> 
    <%= time_ago_in_words(activity_item.created_at) %> ago. 
    </span> 
    <% if current_user?(activity_item.user) %> 
    <%= link_to "delete", activity_item, :method => :delete, 
            :confirm => "Are you sure?", 
            :title => activity_item.content %> 
    <% end %> 
</li> 

然後你就看到我鏈接到了「共享/加入部分高於其可以在下面

_join.html.erb文件中可以看出

<%= form_for(current_user.lecturerelationships.build(:joinedlecture_id => activity_item.id)) do |f| %> 
    <div> 
    <%= f.hidden_field :joinedlecture_id %> 
    </div> 
    <%= f.submit "Join", :class => "btn btn-large btn-info" %> 
<% end %> 

,可能需要一些更多的文件:

的config/routes.rb中

SampleApp::Application.routes.draw do 
    resources :users do 
    member do 
    get :following, :followers, :joined_lectures 
    end 
end 

resources :sessions, :only => [:new, :create, :destroy] 
resources :lectures, :only => [:create, :destroy, :show] 
resources :relationships, :only => [:create, :destroy] #for users following each other 
resources :lecturerelationships, :only => [:create, :destroy] #users joining existing lectures 

所以會發生什麼是講座來到我activity_feed與底部的加入按鈕選項...這應該創建一個「活躍」的講座關係&「加入講座」(顯然應該是來自用戶&講座班。但我得到的錯誤,當我點擊加入按鈕,如下:

ActiveRecord::StatementInvalid in LecturerelationshipsController#create 

SQLite3::ConstraintException: constraint failed: INSERT INTO "lecturerelationships"  ("active_id", "created_at", "joinedlecture_id", "updated_at") VALUES (?, ?, ?, ?) 

此外,我已經包括了我的用戶模型(好像錯誤是指它) user.rb

class User < ActiveRecord::Base 
    attr_accessible :email, :name, :password, :password_confirmation 
    has_secure_password 
    has_many :lectures, :dependent => :destroy 


    has_many :lecturerelationships, :foreign_key => "active_id", :dependent => :destroy 
    has_many :joined_lectures, :through => :lecturerelationships, :source => :joinedlecture 

    before_save { |user| user.email = email.downcase } 
    before_save :create_remember_token 

    validates :name, :presence => true, :length => { :maximum => 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, :presence => true, 
     :format => { :with => VALID_EMAIL_REGEX }, 
     :uniqueness => { :case_sensitive => false } 
    validates :password, :presence => true, :length => { :minimum => 6 } 
    validates :password_confirmation, :presence => true 

    def activity 
    # This feed is for "My Activity" - basically lectures i've started 
    Lecture.where("user_id = ?", id) 
    end 

    def friendactivity 
    Lecture.from_users_followed_by(self) 
    end 

    # lECTURE TO USER (JOINING) RELATIONSHIPS 
    def joined?(selected_lecture) 
    lecturerelationships.find_by_joinedlecture_id(selected_lecture.id) 
    end 

    def join!(selected_lecture) 
    lecturerelationships.create!(:joinedlecture_id => selected_lecture.id) 
    end 

    def exit!(selected_lecture) 
    lecturerelationships.find_by_joinedlecture_id(selected_lecture.id).destroy 
    end 


end 

感謝任何和所有的幫助 - 我會在這裏一段時間,所以提到我非常感謝有人可能有時間來解決我的問題與我...

+1

對於其中一種,您可能會用更短的變量名稱獲得更愉悅的導航體驗。一個大問題是你的創建操作應該從Lecture表中檢索數據,而不是用戶表。 – cdesrosiers

+0

謝謝cdesrosiers - 這是我完全忽略的東西。我已經更新了上面的那部分。但現在我收到一個新的錯誤,我現在添加 – BennyB

+0

正確的約旦,我試圖創建一個joinedlecture_id(基於常規講座類),有很多「actives_id」(已加入講座的用戶)。 – BennyB

回答

2

我將從以下模型開始,使用註冊表爲會員表。
級別命名對此很關鍵。

class User < ActiveRecord::Base 
    has_many :enrollments 
    has_many :users, :through => :enrollments 
end 

class Lecture < ActiveRecord::Base 
    has_many enrollments 
    has_many users, :through => :enrollments 
end 

class Enrollment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :lecture 
end 

Rails的主要技巧是使用正確的名稱並遵循慣例,並讓框架爲您完成大部分工作。走下去的道路,錯誤可能是無止境的,並且代碼很快就會變得凌亂:)

+0

Thx Michael - 但這不是我目前得到的嗎?只有我稱之爲「Lecturerelationships」而不是「註冊」 – BennyB

+0

我試圖設置「主動」和「加入講座」的原因,如在「Lecturerelationship.rb」文件中看到的,因爲我需要在他們內部做很多事情一個講座,因此正試圖將他們與正常的「用戶」分開。我知道我有很多東西需要學習。 – BennyB

+1

從這些關係和名稱開始。是的,名字是重要的,因爲cdesrosiers也在上面指出。相信我們,我們從艱苦的經歷中學習。一旦你可以使用這些關係,做其他部分。像source和foreign_key這樣的小東西可能會導致錯誤或給出奇怪的錯誤消息。例如,yuor路由的東西看起來好像只能通過與那裏的代碼的關係才能實現。強烈建議您尋找接近你需要的railscast。他們確實展示了最低限度的代碼和最佳實踐方式。 –

1

它看起來像你的_join。 html.erb使用build來形成一個新的lecturerelationships assoc然後join!呼叫使用create在同一個對象上創建另一個。我的猜測是第二次調用會中斷由第一次調用開始的事務,這就是爲什麼你會得到database is locked: commit transaction錯誤。

我認爲將這種代碼保留在視圖之外是一種很好的做法。

+0

謝謝喬丹 - 我修正了一些cdrosiers指出的問題,現在我得到了一個新的錯誤,我拋棄了舊的錯誤信息。有任何想法嗎?謝謝! – BennyB

+1

我說的並不完全正確。你可以'建立'一個關係,然後'.create!'另一個,第二個將成功創建。我認爲你的代碼正在構建一個具有某些屬性的代碼,然後創建一個具有相同屬性的代碼(可能是'joinedlecture_id'?),這導致SQLite拋出一個約束異常。但我不確定爲什麼,因爲我認爲'build'不會觸及數據庫。 – jordanpg

+0

(發表在錯誤的評論上)...正確的約旦,我試圖創建一個有很多「actives_id」(已加入演講的用戶)的joinedlecture_id(基於常規講座課)。 – BennyB