2015-07-26 2 views
1

Хорошо, поэтому я пытаюсь подключить объект Profile к объекту Session через отношения один к одному. Как я понимаю, если у меня есть отношения настроены должным образом, следующий эквивалент (пожалуйста, поправьте меня, если я ошибаюсь)Назначение Rails по взаимному отношению

@my_session << @my_profile 

@my_session.profile = @my_profile 

@my_session.profile_id = @my_profile.id 

У меня есть следующие настройки в моей папке модели

profile.rb:

class Profile < ActiveRecord::Base 
    has_one :session 

session.rb:

class Session < ActiveRecord::Base 
    # I tried this without foreign_key also, it works the same 
    belongs_to :profile, :foreign_key => 'profile_id' 

И в моих таблицах базы данных, сеанс profile_id в нем

Doing следующие две команды в моей рельсах консоли работает отлично:

@my_session.profile = @my_profile 

@my_session.profile_id = @my_profile.id 

Однако, когда я пытаюсь сделать следующее:

@my_session << @my_profile 

Я получаю сообщение об ошибке

NoMethodError: undefined method `<<' for #<Session:0x00000004a26198> 
from /.../rubies/ruby-2.2.2/lib/ruby/gems/2.2.0/gems/activemodel-4.2.3/lib/active_model/attribute_methods.rb:433:in `method_missing' 

Это какая-то проблема с тем, как я устанавливаю рельсы или что-то в этом роде? Любая помощь будет большой. Благодарю.

ответ

1

При объявлении has_one ассоциации по модели ActiveRecord он получает следующие методы:

association(force_reload = false) 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 
create_association!(attributes = {}) 

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

http://guides.rubyonrails.org/association_basics.html#has-one-association-reference

Оператор << лопата определяются вместе со всеми этими методами, когда вы включаете has_many или has_and_belongs_to_many на модели:

collection(force_reload = false) 
collection<<(object, ...) 
collection.delete(object, ...) 
collection.destroy(object, ...) 
collection=(objects) 
collection_singular_ids 
collection_singular_ids=(ids) 
collection.clear 
collection.empty? 
collection.size 
collection.find(...) 
collection.where(...) 
collection.exists?(...) 
collection.build(attributes = {}, ...) 
collection.create(attributes = {}) 
collection.create!(attributes = {}) 

Вот подробности :

http://guides.rubyonrails.org/association_basics.html#has-many-association-reference

http://guides.rubyonrails.org/association_basics.html#has-and-belongs-to-many-association-reference

+0

Хорошо, так что вы говорите, что если я сделаю связь 1-1, я не смогу использовать << и должен использовать один из двух вариантов, которые у меня есть, или create_association, или build_association? – mrfred

+1

Да. В рубине оператор << обычно используется, чтобы перекопать что-то в коллекцию. Итак, для has_many вы можете думать о том, чтобы подталкивать другой объект в список foo.somethings (через магию), но с has_one нет коллекции объектов, это всего лишь 1, поэтому это одно задание, поэтому оператор типа коллекции не имеет смысла есть – xkickflip

+0

Awesome. Спасибо за разъяснения! – mrfred

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