HABTM关系和命名范围

时间:2010-02-01 22:20:07

标签: ruby-on-rails relational-database has-and-belongs-to-many

我已经在这方面工作了一段时间,我似乎无法找到错误的位置。

我有一个用户模型(:名称,:密码,:电子邮件)和事件模型(:名称,等)和兴趣模型(:名称)[>所有单数<]

然后我创建了两个连接表 - >用户兴趣和活动兴趣;每个都不包含主键,并且分别仅包含user_id / interest_id和event_id / interest_id。 [>复数<]

我的模型包含HABTM关系如下

user.rb => has_and_belongs_to_many :interests
event.rb => has_and_belongs_to_many :interests
interest.rb => has_and_belongs_to_many :users
               has_and_belongs_to_many :events
events_interests.rb => has_and_belongs_to_many :interests
                       has_and_belongs_to_many :events
users_interests.rb => has_and_belongs_to_many :users
                      has_and_belongs_to_many :interests

Whew..ok所以我想创建一个named_scope,找到与特定用户有共同兴趣的所有事件。这是一些有人帮我的代码。

named_scope :shares_interest_with_user, lambda {|user| { :joins => "LEFT JOIN
              events_interests ei ON ei.event_id = Event.id " +
             "LEFT JOIN users_interests ui ON ui.interest_id = ei.interest_id",
           :conditions => ["ui.user_id = ?", user]  }}

当我从控制器运行时=>

  @user = User.find(1) 
  @events = Event.shares_interest_with_user(@user)

我收到SQL错误:“没有这样的列:Event.id:SELECT”events“。* FROM”events“LEFT JOIN events_interests ei ON ei.event_id = ...........”< / p>

现在我确定事件模型有一个id,我认为我的所有列名都正确。谁能看到有什么遗失?

1 个答案:

答案 0 :(得分:2)

我建议远离HABTM,而是使用has_many :through

以下是great blog post解释SO用户Jaime Bellmyer所写的差异。