0

Привет, у меня есть небольшая проблема с has_many через отношения для моего приложения и надеялся найти какую-то помощь. Итак, у меня есть пользователи & Лекции. Лекции создаются одним пользователем, но затем другие пользователи могут «присоединиться» к созданным Лекциям. У пользователей есть свой собственный фид профилей Лекций, которые они создали. & также есть лента друзей лекций. Однако этот вопрос связан не с созданием лекции, а скорее с «объединением» уже созданной лекции. Я создал модель «lecturerelationships» & для обработки этих отношений между Лекциями & Пользователями, которые присоединились (которые я называю «активами»). Затем пользователи также ДОЛЖНЫ «выйти» из лекции (либо нажав «Выход», либо перейдя по одной из навигационных ссылок заголовка). Я благодарен, если кто-то может работать через некоторые из этого со мной ...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

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 %> 

еще несколько файлов, которые могут быть необходимы:

конфигурации/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 с Join вариант кнопки в нижней части ... которая должна создать преподавательский состав «активного» & «joinlecture» (который, как предполагается, должен поступать от пользователей классов &. Но ошибка, я получаю, когда я нажмите на кнопку присоединиться выглядит следующим образом:

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

Во-первых, у вас могут быть более приятные рельсы с более короткими именами переменных. Одна большая проблема заключается в том, что ваше действие create должно извлекать данные из таблицы Lecture, а не таблицы User. – cdesrosiers

+0

Спасибо, cdesrosiers - это было что-то, что я полностью забыл. Я обновил эту часть выше. но теперь я получаю новую ошибку, которую добавляю сейчас – BennyB

+0

правильно jordan, я пытаюсь создать joinlecture_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 

Основной трюк рельсам использует правильные имена и следующие конвенции и позволяя рамки делать большую часть работы за вас. Шаг за шагом, и ошибки могут быть бесконечными, и код быстро становится беспорядочным :)

+0

Thx Michael - но разве это не то, что у меня есть? только я называю это «Lecturerelationships» вместо «Зачисление» – BennyB

+0

Причина, по которой я пытаюсь настроить «Actives» и «RegisteredLectures», как показано в файле «Lecturerelationship.rb», заключается в том, что мне нужно много сделать с ними лекция и поэтому пытаюсь отделить их от обычных «пользователей». Я знаю, что у меня есть чему поучиться. – BennyB

+1

Начните с этих отношений и имен. Да, имена важны, так как упомянутые выше cdesrosiers. Доверяйте нам, что мы учились на тяжелом опыте. Как только вы сможете использовать эти отношения, выполните другие части. Маленькие вещи, такие как source и foreign_key, могут способствовать ошибкам или давать странные сообщения об ошибках. Например, объекты маршрутов yuor выглядят так, как будто это можно было бы выполнить через отношения с большим количеством кода, который есть там. Настоятельно рекомендуем вам искать railscast, который близок к тому, что вам нужно. Они действительно показывают минимальный код и лучший способ. –

1

Похоже на ваш _join. html.erb использует build для формирования нового lecturerelationships а затем вызов join! использует create, чтобы сделать еще один на том же объекте.Я предполагаю, что второй вызов прерывает транзакцию, начатую первым, и именно поэтому вы получаете ошибку database is locked: commit transaction.

Я считаю, что считается хорошей практикой сохранять этот вид кода вне своих взглядов.

+0

спасибо jordan - я исправил что-то cdrosiers указал, и теперь я получаю новую ошибку, которую я бросил вместо старого сообщения об ошибке. Есть идеи? спасибо! – BennyB

+1

То, что я сказал, не совсем верно. Вы можете «.build» одно отношение, а затем «.create!» Другое, а второе будет создано успешно. Я думаю, что ваш код строит один с определенными атрибутами, а затем создает один с теми же атрибутами (возможно, 'joinlecture_id'?), И это вызывает SQLite для исключения исключения ограничений. Я не уверен, почему, хотя, потому что я думал, что 'build' не попадает в БД. – jordanpg

+0

(отправил это с неправильным комментарием) ... correct jordan, я пытаюсь создать joinlecture_id (основанный на регулярном классе лекций), в котором много «actives_id» (пользователи, присоединившиеся к лекции). – BennyB

Смежные вопросы