2011-10-04 58 views
1

我有用户模型,事件模型,事件优先级模型和事件类型模型。型号代码如下:在Rails控制台中测试模型关联时出现奇怪的结果

class Event < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :event_priority 
    belongs_to :event_type 

    attr_accessible :name, :raised_date, :location, :description, :longtitude, :latitude 
    attr_protected :raised_user_id, :event_priority_id, :event_type_id 
end 

class EventPriority < ActiveRecord::Base 

    has_many :events 
    has_many :users, :through => :events 
    has_many :event_types, :through => :events 

end 

class EventType < ActiveRecord::Base 

    has_many :events 
    has_many :users, :through => :events 
    has_many :event_priorities, :through => :events 

end 

class User < ActiveRecord::Base 

    attr_accessor :password 
    attr_accessible :first_name, :last_name, :full_name, :password, password_confirmation 

    has_many :events, :foreign_key => "raised_user_id", :dependent => :destroy 
    has_many :event_priorities, :through => :events 
    has_many :event_types, :through => :events 

end 

任何人都可以解释无法从以下轨道控制台示例中的事件返回到用户?

irb(main):027:0> @user = User.find(2) 
=> Returns the user with an ID of 2. 

irb(main):028:0> @user.events 
=> Returns all events for that user. 

irb(main):029:0> @user.events.first.user 
=> nil --HUH???? 

irb(main):031:0> @event = @user.events.first 
=> Saves and returns the first event created by the user. 

irb(main):032:0> @event.user 
=> nil --Again, WHY?? 

irb(main):033:0> @events = Event.all 
=> Saves and returns all events. 

irb(main):035:0> @events.first.user 
NoMethodError: You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.first 
     from (irb):35 
     from C:/RailsInstaller/Ruby1.8.7/lib/ruby/gems/1.8/gems/activemodel-3.0. 
6/lib/active_model/attribute_methods.rb:279 -- AGAIN, WHY? 
+1

你可以发布':user'和':event'的模型关联吗? –

+0

好吧,我明白了!所以a:custom_key必须在Rails模型关联的两边指定,在我的例子中是has_many和belongs_to。 –

回答

1

你有一个很好的理由不只是使用user_id作为events表的外键? (这是什么原因造成您的问题)

尝试添加foreign_key选项在事件类以及

+0

真棒家伙,感谢您的帮助,现在全部排序。 –

0

您可以从用户获取事件,因为你已经告诉“用户的has_many事件”关联使用您的自定义外键。你不能回头,因为你没有告诉“Event belongs_to User”关联使用该自定义密钥。因此,它期望它找不到默认的“user_id”键,所以它无法恢复。

我很惊讶它优雅地处理它(通过返回零),实际上 - 我会期望它在这一点上抛出异常。

我恐怕不知道你的第二个问题。我只能猜测,你以某种方式设置@eventsnil缺失IRB线#34 ...

希望有所帮助!

+0

所以我应该将:foreign_key =>“raised_user_id”移动到Events模型中,还是应该在User和Events模型中使用? –

+0

@raouldeveloper - 它需要在两个地方。但是,如果你只是使用属性'user_id',你就不需要它在任何地方(见klochner的答案)。任何你不能这样做的理由? –

+0

行了!关于关联的官方Rails指南并不清楚这两种模式中的外键都必须在代码中。我想在将来使用预期的user_id会更好......感谢一百万! –