2010-10-27 2 views
4

Я хотел бы присоединиться еще три таблицы в рельсах 3рельсы 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).

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

+0

Возможно, вы можете отложить свой код и включить пример того, что вам нужно в вашем представлении. – mark

+0

Извините меня Отметьте для моей плохой практики, я отступаю свой код. – user488464

ответ

0

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

UserComment.find(:all, :conditions => { 
    :user_id => 123, 
    :offer_id => 456 
}).collect(&:comment) 
+0

Благодарим вас за ответ, но нет решения использовать ассоциированные свойства модели рельсов? – user488464

+0

Да, возможно, есть, но в этом примере вам вообще не нужно прикасаться к таблице «users». Все другое решение добавляет 'users' к соединению, что замедлит ваш запрос. Сейчас это может показаться незначительным, но когда размер ваших данных растет, а количество запросов увеличивается, вы поблагодарите меня. – Ariejan

+0

примера. – user488464

0

Он смотрит на меня, как то, что вы хотите:

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

Да, Adam, это правда. Мой анализ ошибочен. Идентификатор пользователя должен быть в модели комментариев, с предложением id, который я думаю. Спасибо вам за помощь. – user488464

0

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

мой код

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

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

и в моем index.html.erb

<% @ offer.эээээ | airoffer | %>

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

<% конец%>

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

0

Я хотел бы использовать его таким образом:

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 есть много красивых способов написания запросов.

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