рельсы 3, объединяющие более трех столов - PullRequest
6 голосов
/ 27 октября 2010

Я хотел бы объединить более трех таблиц в рельсах 3

мой код

class offer < ActiveRecord::Base 

  belongs_to :user
  has_many :usercomments, :dependent => :destroy
  has_many :comments, :through => :usercomments, :dependent => :destroy

end
class User < ActiveRecord::Base

  has_many :usercomments, :dependent =>:destroy
  has_many :comments,:through => :usercomments, :dependent => :destroy
  has_many :offers, :dependent => :destroy

end 
class Usercomment < ActiveRecord::Base

  belongs_to :user
  belongs_to :comment
  belongs_to :offer

end
class Comment < ActiveRecord::Base

  has_one :usercomment, :dependent => :destroy
  has_one :offer, :through => :usercomments
  has_one :user, :through => :usercomments

end

схема

create_table "offers", :force => true do |t|
  t.integer  "step_id"  
  t.integer  "user_id"  
  t.date     "offerdate"  
end
create_table "users", :force => true do |t|  
  t.string   "firstname",            :limit => 100, :default => ""  
  t.string   "lastname",             :limit => 100, :default => ""  
  t.string   "email",                :limit => 100  
end
create_table "usercomments", :force => true do |t|
  t.integer  "user_id"
  t.integer  "airoffer_id"
  t.integer  "comment_id"
  t.boolean  "shared"
end 
create_table "comments", :force => true do |t|
  t.string   "comment" 
  t.datetime "created_at"
  t.datetime "updated_at"
end

index.html.erb

 <% airoffers.each do |airoffer| %>

???

 <% end %> 

и на моей странице html.erb я хотел бы найти комментарий для предложения (offer_id) и пользователя (user_id).

Не могли бы вы помочь мне? спасибо и извините за мое английское выражение, я француз.

Ответы [ 4 ]

0 голосов
/ 21 декабря 2010

Я бы использовал это так:

Comment.find( 
  :all, 
  :conditions => {
    :user_id  => 123,
    :offer_id => 456
  },
  :join => :usercomment
)

ИЛИ:

Comment.find( 
  :all, 
  :conditions => [
    "usercomments.user_id = ? AND usercomments.offer_id = ?",
    123,
    456
  ],
  :join => :usercomment
)

В Rails есть много прекрасных способов написания запросов.

0 голосов
/ 28 октября 2010

Мне кажется, что вы хотите:

class User < ActiveRecord::Base
   has_many :comments
   has_many :offers
end

class Offer < ActiveRecord::Base
   has_many :comments
   belongs_to :user
end

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :offer
end

Если вы хотите, чтобы все комментарии принадлежали конкретному пользователю и конкретному предложению, просто наберите Comment.where(:user_id => # :offer_id => #) и передайте пользователя иПредложение, которое вы хотите.

Помогает ли это?

0 голосов
/ 29 октября 2010

Наконец, я выбрал это решение

мой код

class offer < ActiveRecord::Base 

  belongs_to :user
  has_many :comments, :dependent => :destroy, :order => "updated_at DESC"

end
class User < ActiveRecord::Base

  has_many :comments,:dependent => :destroy
  has_many :offers, :dependent => :destroy

end 
class Comment < ActiveRecord::Base

  has_one :user, :dependent => :destroy
  has_one :airoffer, :dependent => :destroy

end

схема

create_table "offers", :force => true do |t|
  t.integer  "user_id"  
  t.date     "offerdate"  
end
create_table "users", :force => true do |t|  
  t.string   "firstname",            :limit => 100, :default => ""  
  t.string   "lastname",             :limit => 100, :default => ""  
  t.string   "email",                :limit => 100  
end
create_table "comments", :force => true do |t|
  t.integer  "user_id"
  t.integer  "offer_id"  
  t.string   "comment" 
  t.datetime "created_at"
  t.datetime "updated_at"
end

в offer_controller.rb

@ offer = User.find (current_user.id) .offers.includes (: комментарии)

и в моем index.html.erb

<% @offer.each do | airoffer |%>

<% airoffer.comments [0] .comment%>

<% end%>

Я знаю, это не лучшее решение, но в первомраз я буду использовать это.

0 голосов
/ 27 октября 2010

Это даст вам массив комментариев для пользователя # 123 en Предложение # 456

UserComment.find(:all, :conditions => {
  :user_id  => 123,
  :offer_id => 456
}).collect(&:comment)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...