2012-04-07 6 views
0

Я действительно застрял на эту проблему, и я не могу найти способ, чтобы выйти из него:Вложенные ресурсы имеет много: через выпуск отношений

У меня есть модель пользователя (построен с завещанию).

У меня есть модель элемента, которая является вложенным ресурсом для пользователя.

В пользовательской модели (user.rb):

# Setup the relations model 
has_many :items, :dependent => :destroy 

В модели элемента (item.rb):

# Setup the relations model 
belong_to :user 

в routes.rb:

resources :users do 
    resources :items 
end 

Таким образом, пользователь может создать изделие и получить его:

из пути: пользователь/1/items/1

Теперь я хотел бы, чтобы пользователь мог совместно использовать созданный им объект (с его помощью) с другим пользователем, но владел этим предметом (только пользователь который создал элемент, может его уничтожить, и только пользователь, создавший элемент, может обновить некоторое поле элемента, вместо этого другие поля должны быть обновляемыми (редактируемыми) также пользователем, полученным элементом). Другими словами, я хотел бы, чтобы разрешение на элемент было другим для создавшего его пользователя и пользователя, который только что получил его.

Для того, чтобы дать возможность совместного действия элементов между пользователями, я построить следующий as_many: через отношения:

Я создал другую модель, которая называется обмен (которые представляют совместную таблицу между моделью элемента и пользователем модель):

Затем я изменил user.rb (модель пользователя) следующим образом:

# Setup the Item relations model 
has_many :items, :dependent => :destroy # this to set up the item ownership 

#This to set up the has_many :through realtionship 
#(note I am calling a new model shared_items - that really doesn't exist - is an item model) 
has_many :sharings 
has_many :shared_items, :foreign_key => "shared_user_id", :through => :sharings 

accepts_nested_attributes_for :items #This will work for the nested items resource 
accepts_nested_attributes_for :sharings #Do I really need this line?? 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, 
       :items_attributes, #This will work for the nested items resource 
       :sharings_attributes #Do I really need this line?? 

Затем я изменил item.rb (модель элемент) следующим образом:

# Setup the relations model 
belong_to :user 

#this two lines are suppose to connect the two models (item and receiver) using a joint table 
has_many :sharings 
has_many :shared_users, :foreign_key => "shared_item_id", :through => :sharings 

accepts_nested_attributes_for :sharings #Do I really need this line?? 

attr_accessible :user_id, :item_type, :reference_date, :title, 
       :sharings_attributes #Do I really need this line?? 

Я написал sharing.rb (модель обмена - совместный стол) следующим образом:

belongs_to :shared_user, :class_name => "User" 
belongs_to :shared_item, :class_name => "Item" 

attr_accessible :shared_moment_id, :shared_user_id 

После, я должен был учитывать тот факт, что приемник также является пользователем (является а также в моем приложении еще есть модель дружбы (которая позволяет пользователю дружить с другими пользователями, и это работает как шарм), но я считаю, что предложение Джоэля может помочь (или просто изменить ссылка на мою таблицу друзей).

С помощью этого на месте я могу создать спокойный контроллер для Item (ItemsController) и добавить новые, создавать, показывать, уничтожать и т. Д. Действия, которые позволят пользователю (фактически current_user) создавать элемент, уничтожать или обновлять это без проблем. (как вы можете видеть в модели элемента, есть внешний ключ user_id).

Что мне нужно сделать, чтобы создать спокойный контроллер для управления моделью совместного доступа (для создания новых общих элементов и для их назначения (совместно использовать их) с другими пользователями) ???

Как после вызова значений базы данных?Я имею в виду, например:

Пользователь с id 3 создал пять новинок (с идентификатором товара 1, 2,3,4,5), теперь он также решил поделиться некоторыми из этого элемента с другими пользователями (пункт 2 с пользователь 6, пункт 4,5 с пользователем 7,8,9) ???

вытаскивает вложенный ресурс для совместного использования, и теперь я просто:

элемента является вложенным ресурсом пользователя (пользователь/2/пункт/5) делясь будет ??

Пожалуйста кто мне помочь ....

Спасибо большое Dinuz

UPDATE Я был в состоянии позволить работать должным образом приложение, но только отдельные части:

пользователь создает элемент. После того, как он решил поделиться этим товаром с другим пользователем (и используя контроллер разделов - общий контроллер таблицы, мне удалось создать запись внутри общей таблицы (передача идентификатора пользователя и идентификатора элемента).

Теперь я хотел бы выполнить всю операцию всего за один кадр:

Текущий_защик (пользователь, который вошёл в систему) создает элемент, и ему нужно иметь в той же форме возможность поделиться им с другими пользователей (массив) или просто сохранить для себя.

Я считаю, что этот дальнейший шаг требует расплавить контроллер элемента и контроллер совместного доступа и сделать то же самое в новом виде.

Ну, как мне нужно продолжить? Если кто-то может предложить хороший учебник для has_many: это может покрыть мой случай (мне действительно нужно понять, как в этой ситуации будет выглядеть контроллер и представление), я думаю, что ассоциация модели настроена хорошо, но я не может понять, как работать с контроллером и представлением.

ответ

1

Вы можете использовать пользовательскую проверку, как это:

class User < ActiveRecord::Base 
    validate :sharing_with_friends_only 

    def sharing_with_friends_only 
    (receivers - friends).empty? 
    end 
end 

Как вы упоминаете, легкий способ заключается в ун-гнездо ресурсов.

Это также сделает ваши API более чистыми.

+0

Привет, Джоэл, ваша идея хорошая, но мне нужно выяснить, как мне нужно настроить ассоциации в моделях. – Dinuz

+0

Я собираюсь ИЗМЕНИТЬ свое сообщение, чтобы обновить вопрос. – Dinuz

+0

Ну, я решил проблему .... спасибо снова, в любом случае, joel !!! – Dinuz

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