大家好开发者! 最近我一直在玩Rails 3.0,经过相当多的研究,我有点卡住了。 我想知道在我的情况下哪种方法或解决方案最好(我还没有找到答案)。 所以我想要实现的目标很简单直接。
我想做这样的事情:
class User < ActiveRecord::Base
has_many :feeds
has_many :casts, :through => :feeds
end
class Feed < ActiveRecord::Base
has_many :users
has_many :casts
end
class Cast < ActiveRecord::Base
belongs_to :feed
end
所以最后我需要像User.first.feeds这样的方法来获取所有用户的feed和User.first.casts来通过他/她的feed获取所有用户的演员表。拥有Feed.first.casts和Feed.first.users也会很高兴。非常简单,对,但是我也很难为我想要实现的目标创建迁移。
我知道上面的代码不起作用 - 我一直在玩它,所以这只是我想要实现的概念。
基本上我的问题是:我应该通过某种方式加入模型还是使用范围?(也可以给出代码片段)以及如何进行迁移?
谢谢,对不起,我在网上找不到关于这个简单案例的更多信息。
编辑:has_and_belongs_to_many用户和Feed在我的情况下不起作用,因为它不允许我使用@ user.casts,它只提供@ user.feeds和@ feed.users
答案 0 :(得分:2)
您想要的是用户和Feed之间的多对多关系。
您的代码中需要使用类似的内容才能使用户和Feed关系正常工作。
class User < ActiveRecord::Base
has_and_belongs_to_many :feeds
end
class Feed < ActiveRecord::Base
has_and_belongs_to_many :users
end
您可以在Rails指南中了解更多相关信息 - http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association
如果您想存储用户提要关系记录的任何元数据,您可能还需要查看使用has_many:through以及此中间模型(此处解释为http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many)。
编辑:我设法在3.0和3.1上使用类似的设置(使用has_many:through)。
以下是我模特的内容。
➜ app cat app/models/*
class Cast < ActiveRecord::Base
belongs_to :feed
end
class Feed < ActiveRecord::Base
has_many :subscriptions
has_many :casts
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :feed
end
class User < ActiveRecord::Base
has_many :subscriptions
has_many :feeds, :through => :subscriptions
# For 3.1
has_many :casts, :through => :feeds
# For 3.0
def casts
Cast.joins(:feed => :subscriptions).where("subscriptions.user_id" => self.id)
end
end
以下是我使用的迁移
➜ app cat db/migrate/*
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :name
t.timestamps
end
end
def self.down
drop_table :users
end
end
class CreateFeeds < ActiveRecord::Migration
def self.up
create_table :feeds do |t|
t.string :name
t.timestamps
end
end
def self.down
drop_table :feeds
end
end
class CreateCasts < ActiveRecord::Migration
def self.up
create_table :casts do |t|
t.string :name
t.integer :feed_id
t.timestamps
end
end
def self.down
drop_table :casts
end
end
class CreateSubscriptions < ActiveRecord::Migration
def self.up
create_table :subscriptions do |t|
t.integer :feed_id
t.integer :user_id
end
end
def self.down
drop_table :subscriptions
end
end
答案 1 :(得分:0)
在http://railscasts.com/episodes/265-rails-3-1-overview中,Ryan Bates表示rails 3.1支持链接has_many:通过调用。这在3.0
中是不可能的